From 9820c24660c781e45374d1f4c54693610635d446 Mon Sep 17 00:00:00 2001 From: Mark Rendle Date: Fri, 20 Sep 2013 18:27:19 +0100 Subject: [PATCH 01/15] So broken right now... --- .gitattributes | 63 + CommonAssemblyInfo.cs | 48 +- .../PerformanceTestConsole.csproj | 150 +- PerformanceTestConsole/app.config | 36 +- PerformanceTestConsole/packages.config | 10 +- ProfilingApp/App.config | 18 +- ProfilingApp/ProfilingApp.csproj | 207 +- ProfilingApp/Properties/Resources.Designer.cs | 174 +- ProfilingApp/Properties/Settings.Designer.cs | 72 +- .../Simple.Data.AdapterApi.csproj | 121 +- .../Simple.Data.Ado.Test.csproj | 183 +- Simple.Data.Ado.Test/packages.config | 6 +- .../AdoAdapter.IAdapterWithTransactions.cs | 300 +- Simple.Data.Ado/AdoAdapter.cs | 761 +- Simple.Data.Ado/AdoAdapterRelatedFinder.cs | 159 +- .../AdoOptimizingDelegateFactory.cs | 47 +- .../Properties/Settings.Designer.cs | 70 +- Simple.Data.Ado/Simple.Data.Ado.csproj | 5 + Simple.Data.Ado/app.config | 30 +- Simple.Data.BehaviourTest/App.config | 28 +- .../Simple.Data.BehaviourTest.csproj | 253 +- Simple.Data.BehaviourTest/packages.config | 6 +- .../Simple.Data.InMemoryTest.csproj | 167 +- Simple.Data.InMemoryTest/packages.config | 6 +- .../Simple.Data.Mocking.Test.csproj | 164 +- .../Simple.Data.Mocking.csproj | 190 +- Simple.Data.Mocking/XmlMockAdapter.cs | 389 +- .../Properties/Resources.Designer.cs | 180 +- .../Simple.Data.SqlCe40.csproj | 207 +- Simple.Data.SqlCe40/packages.config | 6 +- .../Simple.Data.SqlCe40Test.csproj | 319 +- Simple.Data.SqlCe40Test/packages.config | 8 +- .../Properties/Resources.Designer.cs | 188 +- .../Simple.Data.SqlServer.csproj | 215 +- .../Properties/Resources.Designer.cs | 150 +- .../Properties/Settings.Designer.cs | 73 +- .../Properties/Settings.settings | 26 +- Simple.Data.SqlTest/SetupFixture.cs | 74 +- .../Simple.Data.SqlTest.csproj | 363 +- Simple.Data.SqlTest/SimpleTest.mdf | Bin 0 -> 3211264 bytes Simple.Data.SqlTest/SimpleTest_log.ldf | Bin 0 -> 1638400 bytes Simple.Data.SqlTest/app.config | 22 +- Simple.Data.SqlTest/packages.config | 6 +- .../Simple.Data.TestHelper.csproj | 171 +- Simple.Data.TestHelper/packages.config | 8 +- Simple.Data.UnitTest/AdapterFactoryTest.cs | 202 +- ...BeginTransactionWithIsolataionLevelTest.cs | 229 +- .../Simple.Data.UnitTest.csproj | 269 +- Simple.Data.UnitTest/packages.config | 8 +- Simple.Data.sln | 557 +- Simple.Data/Adapter.cs | 916 +- Simple.Data/BinderHelper.cs | 18 +- Simple.Data/Commands/ArgumentHelper.cs | 100 +- Simple.Data/Commands/DeleteByCommand.cs | 86 +- .../Commands/ExecuteFunctionCommand.cs | 106 +- Simple.Data/Commands/FindByCommand.cs | 185 +- Simple.Data/Commands/FindCommand.cs | 95 +- Simple.Data/Commands/GetCommand.cs | 105 +- Simple.Data/Commands/InsertCommand.cs | 175 +- Simple.Data/Commands/UpsertByCommand.cs | 139 +- Simple.Data/Commands/UpsertCommand.cs | 167 +- Simple.Data/DataStrategy.cs | 284 +- Simple.Data/DatabaseRunner.cs | 218 +- Simple.Data/DynamicTable.cs | 389 +- Simple.Data/EnumerableEx.cs | 65 +- Simple.Data/Extensions/ObjectEx.cs | 153 +- Simple.Data/IAdapterWithFunctions.cs | 38 +- Simple.Data/IAdapterWithTransactions.cs | 136 +- Simple.Data/InMemoryAdapter.cs | 835 +- ...InMemoryAdapterIAdapterWithTransactions.cs | 196 +- Simple.Data/MethodNameParser.cs | 154 +- Simple.Data/Operations/FindOperation.cs | 24 + Simple.Data/Operations/GetOperation.cs | 24 + Simple.Data/Operations/InsertOperation.cs | 65 + Simple.Data/Operations/Operation.cs | 7 + Simple.Data/Operations/UpsertOperation.cs | 94 + Simple.Data/OptimizingDelegateFactory.cs | 47 +- Simple.Data/PropertySetterBuilder.cs | 761 +- .../QueryPolyfills/WhereClauseHandler.cs | 425 +- Simple.Data/RunStrategy.cs | 177 +- Simple.Data/Simple.Data.csproj | 454 +- Simple.Data/SimpleRecord.cs | 361 +- Simple.Data/SimpleResultSet.cs | 636 +- Simple.Data/TransactionRunner.cs | 191 +- Simple.Data/app.config | 20 +- .../NUnit.2.5.10.11092.nuspec | 13 + packages/NUnit.2.5.9.10348/Logo.ico | Bin 0 -> 1078 bytes .../NUnit.2.5.9.10348.nuspec | 13 + packages/NUnit.2.5.9.10348/NUnitFitTests.html | 277 + .../Tools/NUnitFitTests.html | 277 + .../NUnit.2.5.9.10348/Tools/NUnitTests.config | 85 + .../NUnit.2.5.9.10348/Tools/NUnitTests.nunit | 14 + packages/NUnit.2.5.9.10348/Tools/agent.conf | 4 + .../NUnit.2.5.9.10348/Tools/agent.log.conf | 18 + .../NUnit.2.5.9.10348/Tools/launcher.log.conf | 18 + .../NUnit.2.5.9.10348/Tools/lib/Failure.png | Bin 0 -> 1445 bytes .../NUnit.2.5.9.10348/Tools/lib/Ignored.png | Bin 0 -> 1444 bytes .../Tools/lib/Inconclusive.png | Bin 0 -> 1436 bytes .../NUnit.2.5.9.10348/Tools/lib/Skipped.png | Bin 0 -> 1405 bytes .../NUnit.2.5.9.10348/Tools/lib/Success.png | Bin 0 -> 1439 bytes .../Tools/nunit-agent-x86.exe.config | 69 + .../Tools/nunit-agent.exe.config | 69 + .../Tools/nunit-console-x86.exe.config | 69 + .../Tools/nunit-console.exe.config | 69 + .../Tools/nunit-x86.exe.config | 83 + .../NUnit.2.5.9.10348/Tools/nunit.exe.config | 83 + .../Tools/pnunit-agent.exe.config | 77 + .../Tools/pnunit-launcher.exe.config | 77 + .../Tools/runFile.exe.config | 43 + .../NUnit.2.5.9.10348/Tools/runpnunit.bat | 2 + packages/NUnit.2.5.9.10348/Tools/test.conf | 24 + packages/NUnit.2.5.9.10348/fit-license.txt | 342 + .../NUnit.2.5.9.10348/lib/nunit.framework.xml | 10385 ++++++++++++++++ packages/NUnit.2.5.9.10348/license.txt | 15 + .../Simple.Data.Ado.0.6.1.nuspec | 20 + .../Simple.Data.Core.0.6.1.nuspec | 17 + .../Simple.Data.SqlCompact40.0.6.1.nuspec | 20 + .../Microsoft.VC90.CRT.manifest | 6 + .../amd64/Microsoft.VC90.CRT/README_ENU.txt | Bin 0 -> 406 bytes .../Microsoft.VC90.CRT.manifest | 6 + .../x86/Microsoft.VC90.CRT/README_ENU.txt | Bin 0 -> 406 bytes .../SqlServerCompact.4.0.8482.1.nuspec | 14 + .../Tools/GetSqlCEPostBuildCmd.ps1 | 24 +- packages/Trespasser.1.1/Trespasser.1.1.nuspec | 16 + 124 files changed, 19725 insertions(+), 7314 deletions(-) create mode 100644 .gitattributes create mode 100644 Simple.Data.SqlTest/SimpleTest.mdf create mode 100644 Simple.Data.SqlTest/SimpleTest_log.ldf create mode 100644 Simple.Data/Operations/FindOperation.cs create mode 100644 Simple.Data/Operations/GetOperation.cs create mode 100644 Simple.Data/Operations/InsertOperation.cs create mode 100644 Simple.Data/Operations/Operation.cs create mode 100644 Simple.Data/Operations/UpsertOperation.cs create mode 100644 packages/NUnit.2.5.10.11092/NUnit.2.5.10.11092.nuspec create mode 100644 packages/NUnit.2.5.9.10348/Logo.ico create mode 100644 packages/NUnit.2.5.9.10348/NUnit.2.5.9.10348.nuspec create mode 100644 packages/NUnit.2.5.9.10348/NUnitFitTests.html create mode 100644 packages/NUnit.2.5.9.10348/Tools/NUnitFitTests.html create mode 100644 packages/NUnit.2.5.9.10348/Tools/NUnitTests.config create mode 100644 packages/NUnit.2.5.9.10348/Tools/NUnitTests.nunit create mode 100644 packages/NUnit.2.5.9.10348/Tools/agent.conf create mode 100644 packages/NUnit.2.5.9.10348/Tools/agent.log.conf create mode 100644 packages/NUnit.2.5.9.10348/Tools/launcher.log.conf create mode 100644 packages/NUnit.2.5.9.10348/Tools/lib/Failure.png create mode 100644 packages/NUnit.2.5.9.10348/Tools/lib/Ignored.png create mode 100644 packages/NUnit.2.5.9.10348/Tools/lib/Inconclusive.png create mode 100644 packages/NUnit.2.5.9.10348/Tools/lib/Skipped.png create mode 100644 packages/NUnit.2.5.9.10348/Tools/lib/Success.png create mode 100644 packages/NUnit.2.5.9.10348/Tools/nunit-agent-x86.exe.config create mode 100644 packages/NUnit.2.5.9.10348/Tools/nunit-agent.exe.config create mode 100644 packages/NUnit.2.5.9.10348/Tools/nunit-console-x86.exe.config create mode 100644 packages/NUnit.2.5.9.10348/Tools/nunit-console.exe.config create mode 100644 packages/NUnit.2.5.9.10348/Tools/nunit-x86.exe.config create mode 100644 packages/NUnit.2.5.9.10348/Tools/nunit.exe.config create mode 100644 packages/NUnit.2.5.9.10348/Tools/pnunit-agent.exe.config create mode 100644 packages/NUnit.2.5.9.10348/Tools/pnunit-launcher.exe.config create mode 100644 packages/NUnit.2.5.9.10348/Tools/runFile.exe.config create mode 100644 packages/NUnit.2.5.9.10348/Tools/runpnunit.bat create mode 100644 packages/NUnit.2.5.9.10348/Tools/test.conf create mode 100644 packages/NUnit.2.5.9.10348/fit-license.txt create mode 100644 packages/NUnit.2.5.9.10348/lib/nunit.framework.xml create mode 100644 packages/NUnit.2.5.9.10348/license.txt create mode 100644 packages/Simple.Data.Ado.0.6.1/Simple.Data.Ado.0.6.1.nuspec create mode 100644 packages/Simple.Data.Core.0.6.1/Simple.Data.Core.0.6.1.nuspec create mode 100644 packages/Simple.Data.SqlCompact40.0.6.1/Simple.Data.SqlCompact40.0.6.1.nuspec create mode 100644 packages/SqlServerCompact.4.0.8482.1/NativeBinaries/amd64/Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest create mode 100644 packages/SqlServerCompact.4.0.8482.1/NativeBinaries/amd64/Microsoft.VC90.CRT/README_ENU.txt create mode 100644 packages/SqlServerCompact.4.0.8482.1/NativeBinaries/x86/Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest create mode 100644 packages/SqlServerCompact.4.0.8482.1/NativeBinaries/x86/Microsoft.VC90.CRT/README_ENU.txt create mode 100644 packages/SqlServerCompact.4.0.8482.1/SqlServerCompact.4.0.8482.1.nuspec create mode 100644 packages/Trespasser.1.1/Trespasser.1.1.nuspec diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..be521d17 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +# * text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/CommonAssemblyInfo.cs b/CommonAssemblyInfo.cs index 3be7ef1c..9f9bc5e2 100644 --- a/CommonAssemblyInfo.cs +++ b/CommonAssemblyInfo.cs @@ -1,24 +1,24 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -#if(DEBUG) -[assembly: AssemblyConfiguration("Debug")] -#else -[assembly: AssemblyConfiguration("Release")] -#endif - -[assembly: AssemblyCompany("Simple.Data")] -[assembly: AssemblyProduct("Simple.Data")] -[assembly: AssemblyCopyright("Copyright © Mark Rendle 2010-2012")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -[assembly: AssemblyVersion("0.18.3.1")] -[assembly: AssemblyFileVersion("0.18.3.1")] - +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +#if(DEBUG) +[assembly: AssemblyConfiguration("Debug")] +#else +[assembly: AssemblyConfiguration("Release")] +#endif + +[assembly: AssemblyCompany("Simple.Data")] +[assembly: AssemblyProduct("Simple.Data")] +[assembly: AssemblyCopyright("Copyright © Mark Rendle 2010-2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +[assembly: AssemblyVersion("2.0.0.1")] +[assembly: AssemblyFileVersion("2.0.0.1")] + diff --git a/PerformanceTestConsole/PerformanceTestConsole.csproj b/PerformanceTestConsole/PerformanceTestConsole.csproj index c4ab1f2d..9bd170bf 100644 --- a/PerformanceTestConsole/PerformanceTestConsole.csproj +++ b/PerformanceTestConsole/PerformanceTestConsole.csproj @@ -1,74 +1,78 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6} - Exe - Properties - PerformanceTestConsole - PerformanceTestConsole - v4.0 - Client - 512 - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} - Simple.Data.Ado - - - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1} - Simple.Data.SqlServer - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - - + + + + Debug + x86 + 8.0.30703 + 2.0 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6} + Exe + Properties + PerformanceTestConsole + PerformanceTestConsole + v4.5 + + + 512 + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + + + + + + + + + + + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} + Simple.Data.Ado + + + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1} + Simple.Data.SqlServer + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + + \ No newline at end of file diff --git a/PerformanceTestConsole/app.config b/PerformanceTestConsole/app.config index 5b242640..068ba275 100644 --- a/PerformanceTestConsole/app.config +++ b/PerformanceTestConsole/app.config @@ -1,18 +1,18 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + diff --git a/PerformanceTestConsole/packages.config b/PerformanceTestConsole/packages.config index 2c423502..114812fc 100644 --- a/PerformanceTestConsole/packages.config +++ b/PerformanceTestConsole/packages.config @@ -1,6 +1,6 @@ - - - - - + + + + + \ No newline at end of file diff --git a/ProfilingApp/App.config b/ProfilingApp/App.config index 1eab2c6b..f669a698 100644 --- a/ProfilingApp/App.config +++ b/ProfilingApp/App.config @@ -1,10 +1,8 @@ - - - - - - - - \ No newline at end of file + + + + + + + + diff --git a/ProfilingApp/ProfilingApp.csproj b/ProfilingApp/ProfilingApp.csproj index 9c233236..c1cfdb0e 100644 --- a/ProfilingApp/ProfilingApp.csproj +++ b/ProfilingApp/ProfilingApp.csproj @@ -1,103 +1,106 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {9AAF3008-8033-4A26-93D2-97928E7801E9} - Exe - Properties - ProfilingApp - ProfilingApp - v4.0 - Client - 512 - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - True - True - Resources.resx - - - True - True - Settings.settings - - - - - - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} - Simple.Data.Ado - - - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1} - Simple.Data.SqlServer - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - - - ResXFileCodeGenerator - Resources.Designer.cs - - - - - - - - + + + + Debug + x86 + 8.0.30703 + 2.0 + {9AAF3008-8033-4A26-93D2-97928E7801E9} + Exe + Properties + ProfilingApp + ProfilingApp + v4.5 + + + 512 + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + True + True + Settings.settings + + + + + + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} + Simple.Data.Ado + + + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1} + Simple.Data.SqlServer + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + \ No newline at end of file diff --git a/ProfilingApp/Properties/Resources.Designer.cs b/ProfilingApp/Properties/Resources.Designer.cs index 1c6b9489..62436e5c 100644 --- a/ProfilingApp/Properties/Resources.Designer.cs +++ b/ProfilingApp/Properties/Resources.Designer.cs @@ -1,87 +1,87 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.235 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ProfilingApp.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ProfilingApp.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to SET NOCOUNT ON; - /// - ///IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Comment]') AND type in (N'U')) - ///DROP TABLE [dbo].[Comment]; - ///IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Post]') AND type in (N'U')) - ///DROP TABLE [dbo].[Post]; - /// - ///CREATE TABLE [dbo].[Post] ( - /// [Id] INT IDENTITY (1, 1) NOT NULL, - /// [Title] NVARCHAR (100) NOT NULL, - /// [Content] NVARCHAR (MAX) NOT NULL, - /// [Created] DATETIME NOT NULL - ///); - /// - ///ALTER TABLE [dbo].[Post] - /// [rest of string was truncated]";. - /// - internal static string DatabaseResetSql { - get { - return ResourceManager.GetString("DatabaseResetSql", resourceCulture); - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.18331 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ProfilingApp.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ProfilingApp.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to SET NOCOUNT ON; + /// + ///IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Comment]') AND type in (N'U')) + ///DROP TABLE [dbo].[Comment]; + ///IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Post]') AND type in (N'U')) + ///DROP TABLE [dbo].[Post]; + /// + ///CREATE TABLE [dbo].[Post] ( + /// [Id] INT IDENTITY (1, 1) NOT NULL, + /// [Title] NVARCHAR (100) NOT NULL, + /// [Content] NVARCHAR (MAX) NOT NULL, + /// [Created] DATETIME NOT NULL + ///); + /// + ///ALTER TABLE [dbo].[Post] + /// [rest of string was truncated]";. + /// + internal static string DatabaseResetSql { + get { + return ResourceManager.GetString("DatabaseResetSql", resourceCulture); + } + } + } +} diff --git a/ProfilingApp/Properties/Settings.Designer.cs b/ProfilingApp/Properties/Settings.Designer.cs index 7dafd87b..e4ba807b 100644 --- a/ProfilingApp/Properties/Settings.Designer.cs +++ b/ProfilingApp/Properties/Settings.Designer.cs @@ -1,36 +1,36 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.235 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ProfilingApp.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - - [global::System.Configuration.ApplicationScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.ConnectionString)] - [global::System.Configuration.DefaultSettingValueAttribute("Data Source=.;Initial Catalog=SimpleDataProfiling;Integrated Security=true")] - public string ConnectionString { - get { - return ((string)(this["ConnectionString"])); - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.18331 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ProfilingApp.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.ConnectionString)] + [global::System.Configuration.DefaultSettingValueAttribute("Data Source=.;Initial Catalog=SimpleDataProfiling;Integrated Security=true")] + public string ConnectionString { + get { + return ((string)(this["ConnectionString"])); + } + } + } +} diff --git a/Simple.Data.AdapterApi/Simple.Data.AdapterApi.csproj b/Simple.Data.AdapterApi/Simple.Data.AdapterApi.csproj index b039fb99..3597c1bf 100644 --- a/Simple.Data.AdapterApi/Simple.Data.AdapterApi.csproj +++ b/Simple.Data.AdapterApi/Simple.Data.AdapterApi.csproj @@ -1,60 +1,63 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {67ACEAD5-B457-4B52-9C55-611A61A73B56} - Library - Properties - Simple.Data.AdapterApi - Simple.Data.AdapterApi - v4.0 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - - + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {67ACEAD5-B457-4B52-9C55-611A61A73B56} + Library + Properties + Simple.Data.AdapterApi + Simple.Data.AdapterApi + v4.5 + 512 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + + + + + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + + \ No newline at end of file diff --git a/Simple.Data.Ado.Test/Simple.Data.Ado.Test.csproj b/Simple.Data.Ado.Test/Simple.Data.Ado.Test.csproj index cdebfa7d..693957ad 100644 --- a/Simple.Data.Ado.Test/Simple.Data.Ado.Test.csproj +++ b/Simple.Data.Ado.Test/Simple.Data.Ado.Test.csproj @@ -1,90 +1,95 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {96C623FD-869E-4DCE-98A1-17075EE384F9} - Library - Properties - Simple.Data.Ado.Test - Simple.Data.Ado.Test - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll - - - ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll - - - - - - - - - - - - - - - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} - Simple.Data.Ado - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - - - - - + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {96C623FD-869E-4DCE-98A1-17075EE384F9} + Library + Properties + Simple.Data.Ado.Test + Simple.Data.Ado.Test + 512 + v4.5 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + + ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll + + + ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll + + + ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll + + + + + + + + + + + + + + + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} + Simple.Data.Ado + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + + + + + \ No newline at end of file diff --git a/Simple.Data.Ado.Test/packages.config b/Simple.Data.Ado.Test/packages.config index 27a38197..0c821784 100644 --- a/Simple.Data.Ado.Test/packages.config +++ b/Simple.Data.Ado.Test/packages.config @@ -1,4 +1,4 @@ - - - + + + \ No newline at end of file diff --git a/Simple.Data.Ado/AdoAdapter.IAdapterWithTransactions.cs b/Simple.Data.Ado/AdoAdapter.IAdapterWithTransactions.cs index 915beb12..aaf3d489 100644 --- a/Simple.Data.Ado/AdoAdapter.IAdapterWithTransactions.cs +++ b/Simple.Data.Ado/AdoAdapter.IAdapterWithTransactions.cs @@ -1,150 +1,152 @@ -namespace Simple.Data.Ado -{ - using System; - using System.Collections.Generic; - using System.ComponentModel.Composition; - using System.Data; - using System.Data.SqlClient; - using System.Linq; - using Extensions; - - public partial class AdoAdapter : IAdapterWithTransactions - { - public IAdapterTransaction BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.Unspecified) - { - IDbConnection connection = CreateConnection(); - connection.OpenIfClosed(); - IDbTransaction transaction = connection.BeginTransaction(isolationLevel); - return new AdoAdapterTransaction(transaction, _sharedConnection != null); - } - - public IAdapterTransaction BeginTransaction(string name, IsolationLevel isolationLevel = IsolationLevel.Unspecified) - { - IDbConnection connection = CreateConnection(); - connection.OpenIfClosed(); - var sqlConnection = connection as SqlConnection; - IDbTransaction transaction = sqlConnection != null - ? sqlConnection.BeginTransaction(isolationLevel, name) - : connection.BeginTransaction(isolationLevel); - - return new AdoAdapterTransaction(transaction, name, _sharedConnection != null); - } - - public IEnumerable> InsertMany(string tableName, - IEnumerable> data, - IAdapterTransaction transaction, - Func, Exception, bool> onError, bool resultRequired) - { - return new AdoAdapterInserter(this, ((AdoAdapterTransaction)transaction).DbTransaction).InsertMany( - tableName, data, onError, resultRequired); - } - - public int UpdateMany(string tableName, IEnumerable> data, - IAdapterTransaction transaction) - { - IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? - new BulkUpdater(); - return bulkUpdater.Update(this, tableName, data.ToList(), ((AdoAdapterTransaction)transaction).DbTransaction); - } - - public int UpdateMany(string tableName, IEnumerable> data, - IAdapterTransaction transaction, IList keyFields) - { - IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? - new BulkUpdater(); - return bulkUpdater.Update(this, tableName, data.ToList(), ((AdoAdapterTransaction)transaction).DbTransaction); - } - - public int Update(string tableName, IDictionary data, IAdapterTransaction adapterTransaction) - { - string[] keyFieldNames = GetKeyNames(tableName).ToArray(); - if (keyFieldNames.Length == 0) throw new AdoAdapterException(string.Format("No primary key found for implicit update of table '{0}'.", tableName)); - return Update(tableName, data, GetCriteria(tableName, keyFieldNames, data), adapterTransaction); - } - - public int UpdateMany(string tableName, IList> dataList, - IEnumerable criteriaFieldNames, IAdapterTransaction adapterTransaction) - { - IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? - new BulkUpdater(); - return bulkUpdater.Update(this, tableName, dataList, criteriaFieldNames, - ((AdoAdapterTransaction)adapterTransaction).DbTransaction); - } - - //public IAdapterTransaction BeginTransaction() - //{ - // IDbConnection connection = CreateConnection(); - // connection.OpenIfClosed(); - // IDbTransaction transaction = connection.BeginTransaction(); - // return new AdoAdapterTransaction(transaction, _sharedConnection != null); - //} - - //public IAdapterTransaction BeginTransaction(string name) - //{ - // IDbConnection connection = CreateConnection(); - // connection.OpenIfClosed(); - // var sqlConnection = connection as SqlConnection; - // IDbTransaction transaction = sqlConnection != null - // ? sqlConnection.BeginTransaction(name) - // : connection.BeginTransaction(); - - // return new AdoAdapterTransaction(transaction, name, _sharedConnection != null); - //} - - public IDictionary Get(string tableName, IAdapterTransaction transaction, params object[] parameterValues) - { - return new AdoAdapterGetter(this, ((AdoAdapterTransaction) transaction).DbTransaction).Get(tableName, - parameterValues); - } - - public IEnumerable> RunQuery(SimpleQuery query, IAdapterTransaction transaction, out IEnumerable unhandledClauses) - { - return new AdoAdapterQueryRunner(this, (AdoAdapterTransaction)transaction).RunQuery(query, out unhandledClauses); - } - - public IEnumerable> Find(string tableName, SimpleExpression criteria, - IAdapterTransaction transaction) - { - return new AdoAdapterFinder(this, ((AdoAdapterTransaction)transaction).DbTransaction).Find(tableName, - criteria); - } - - public IDictionary Insert(string tableName, IDictionary data, - IAdapterTransaction transaction, bool resultRequired) - { - return new AdoAdapterInserter(this, ((AdoAdapterTransaction)transaction).DbTransaction).Insert(tableName, - data, resultRequired); - } - - public int Update(string tableName, IDictionary data, SimpleExpression criteria, - IAdapterTransaction transaction) - { - ICommandBuilder commandBuilder = new UpdateHelper(_schema).GetUpdateCommand(tableName, data, criteria); - return Execute(commandBuilder, transaction); - } - - public int Delete(string tableName, SimpleExpression criteria, IAdapterTransaction transaction) - { - ICommandBuilder commandBuilder = new DeleteHelper(_schema).GetDeleteCommand(tableName, criteria); - return Execute(commandBuilder, transaction); - } - - public override IDictionary Upsert(string tableName, IDictionary data, SimpleExpression criteria, bool resultRequired, IAdapterTransaction adapterTransaction) - { - var transaction = ((AdoAdapterTransaction) adapterTransaction).DbTransaction; - return new AdoAdapterUpserter(this, transaction).Upsert(tableName, data, criteria, resultRequired); - } - - public override IEnumerable> UpsertMany(string tableName, IList> list, IAdapterTransaction adapterTransaction, bool isResultRequired, Func, Exception, bool> errorCallback) - { - var transaction = ((AdoAdapterTransaction) adapterTransaction).DbTransaction; - return new AdoAdapterUpserter(this, transaction).UpsertMany(tableName, list, isResultRequired, errorCallback); - } - - public override IEnumerable> UpsertMany(string tableName, IList> list, IEnumerable keyFieldNames, IAdapterTransaction adapterTransaction, bool isResultRequired, Func, Exception, bool> errorCallback) - { - var transaction = ((AdoAdapterTransaction) adapterTransaction).DbTransaction; - return new AdoAdapterUpserter(this, transaction).UpsertMany(tableName, list, keyFieldNames.ToArray(), isResultRequired, errorCallback); - } - } +using Simple.Data.Operations; + +namespace Simple.Data.Ado +{ + using System; + using System.Collections.Generic; + using System.ComponentModel.Composition; + using System.Data; + using System.Data.SqlClient; + using System.Linq; + using Extensions; + + public partial class AdoAdapter : IAdapterWithTransactions + { + public IAdapterTransaction BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.Unspecified) + { + IDbConnection connection = CreateConnection(); + connection.OpenIfClosed(); + IDbTransaction transaction = connection.BeginTransaction(isolationLevel); + return new AdoAdapterTransaction(transaction, _sharedConnection != null); + } + + public IAdapterTransaction BeginTransaction(string name, IsolationLevel isolationLevel = IsolationLevel.Unspecified) + { + IDbConnection connection = CreateConnection(); + connection.OpenIfClosed(); + var sqlConnection = connection as SqlConnection; + IDbTransaction transaction = sqlConnection != null + ? sqlConnection.BeginTransaction(isolationLevel, name) + : connection.BeginTransaction(isolationLevel); + + return new AdoAdapterTransaction(transaction, name, _sharedConnection != null); + } + + public IEnumerable> InsertMany(string tableName, + IEnumerable> data, + IAdapterTransaction transaction, + Func, Exception, bool> onError, bool resultRequired) + { + return new AdoAdapterInserter(this, ((AdoAdapterTransaction)transaction).DbTransaction).InsertMany( + tableName, data, onError, resultRequired); + } + + public int UpdateMany(string tableName, IEnumerable> data, + IAdapterTransaction transaction) + { + IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? + new BulkUpdater(); + return bulkUpdater.Update(this, tableName, data.ToList(), ((AdoAdapterTransaction)transaction).DbTransaction); + } + + public int UpdateMany(string tableName, IEnumerable> data, + IAdapterTransaction transaction, IList keyFields) + { + IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? + new BulkUpdater(); + return bulkUpdater.Update(this, tableName, data.ToList(), ((AdoAdapterTransaction)transaction).DbTransaction); + } + + public int Update(string tableName, IDictionary data, IAdapterTransaction adapterTransaction) + { + string[] keyFieldNames = GetKeyNames(tableName).ToArray(); + if (keyFieldNames.Length == 0) throw new AdoAdapterException(string.Format("No primary key found for implicit update of table '{0}'.", tableName)); + return Update(tableName, data, GetCriteria(tableName, keyFieldNames, data), adapterTransaction); + } + + public int UpdateMany(string tableName, IList> dataList, + IEnumerable criteriaFieldNames, IAdapterTransaction adapterTransaction) + { + IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? + new BulkUpdater(); + return bulkUpdater.Update(this, tableName, dataList, criteriaFieldNames, + ((AdoAdapterTransaction)adapterTransaction).DbTransaction); + } + + //public IAdapterTransaction BeginTransaction() + //{ + // IDbConnection connection = CreateConnection(); + // connection.OpenIfClosed(); + // IDbTransaction transaction = connection.BeginTransaction(); + // return new AdoAdapterTransaction(transaction, _sharedConnection != null); + //} + + //public IAdapterTransaction BeginTransaction(string name) + //{ + // IDbConnection connection = CreateConnection(); + // connection.OpenIfClosed(); + // var sqlConnection = connection as SqlConnection; + // IDbTransaction transaction = sqlConnection != null + // ? sqlConnection.BeginTransaction(name) + // : connection.BeginTransaction(); + + // return new AdoAdapterTransaction(transaction, name, _sharedConnection != null); + //} + + public IDictionary Get(GetOperation operation, IAdapterTransaction transaction) + { + return new AdoAdapterGetter(this, ((AdoAdapterTransaction) transaction).DbTransaction).Get(operation.TableName, + operation.KeyValues); + } + + public IEnumerable> RunQuery(SimpleQuery query, IAdapterTransaction transaction, out IEnumerable unhandledClauses) + { + return new AdoAdapterQueryRunner(this, (AdoAdapterTransaction)transaction).RunQuery(query, out unhandledClauses); + } + + public IEnumerable> Find(FindOperation operation, + IAdapterTransaction transaction) + { + return new AdoAdapterFinder(this, ((AdoAdapterTransaction)transaction).DbTransaction).Find(operation.TableName, + operation.Criteria); + } + + public IDictionary Insert(string tableName, IDictionary data, + IAdapterTransaction transaction, bool resultRequired) + { + return new AdoAdapterInserter(this, ((AdoAdapterTransaction)transaction).DbTransaction).Insert(tableName, + data, resultRequired); + } + + public int Update(string tableName, IDictionary data, SimpleExpression criteria, + IAdapterTransaction transaction) + { + ICommandBuilder commandBuilder = new UpdateHelper(_schema).GetUpdateCommand(tableName, data, criteria); + return Execute(commandBuilder, transaction); + } + + public int Delete(string tableName, SimpleExpression criteria, IAdapterTransaction transaction) + { + ICommandBuilder commandBuilder = new DeleteHelper(_schema).GetDeleteCommand(tableName, criteria); + return Execute(commandBuilder, transaction); + } + + public override IDictionary Upsert(string tableName, IDictionary data, SimpleExpression criteria, bool resultRequired, IAdapterTransaction adapterTransaction) + { + var transaction = ((AdoAdapterTransaction) adapterTransaction).DbTransaction; + return new AdoAdapterUpserter(this, transaction).Upsert(tableName, data, criteria, resultRequired); + } + + public override IEnumerable> UpsertMany(string tableName, IList> list, IAdapterTransaction adapterTransaction, bool isResultRequired, Func, Exception, bool> errorCallback) + { + var transaction = ((AdoAdapterTransaction) adapterTransaction).DbTransaction; + return new AdoAdapterUpserter(this, transaction).UpsertMany(tableName, list, isResultRequired, errorCallback); + } + + public override IEnumerable> UpsertMany(string tableName, IList> list, IEnumerable keyFieldNames, IAdapterTransaction adapterTransaction, bool isResultRequired, Func, Exception, bool> errorCallback) + { + var transaction = ((AdoAdapterTransaction) adapterTransaction).DbTransaction; + return new AdoAdapterUpserter(this, transaction).UpsertMany(tableName, list, keyFieldNames.ToArray(), isResultRequired, errorCallback); + } + } } \ No newline at end of file diff --git a/Simple.Data.Ado/AdoAdapter.cs b/Simple.Data.Ado/AdoAdapter.cs index bdb5ce0d..a3e26938 100644 --- a/Simple.Data.Ado/AdoAdapter.cs +++ b/Simple.Data.Ado/AdoAdapter.cs @@ -1,380 +1,381 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.Composition; -using System.Data; -using System.Linq; -using Simple.Data.Ado.Schema; - -namespace Simple.Data.Ado -{ - using Extensions; - - [Export("Ado", typeof (Adapter))] - public partial class AdoAdapter : Adapter, ICloneable - { - private readonly AdoAdapterFinder _finder; - private readonly ProviderHelper _providerHelper = new ProviderHelper(); - private CommandOptimizer _commandOptimizer = new CommandOptimizer(); - private IConnectionProvider _connectionProvider; - private Lazy _relatedFinder; - private DatabaseSchema _schema; - private IDbConnection _sharedConnection; - private Func _connectionModifier = connection => connection; - - public AdoAdapter() - { - _finder = new AdoAdapterFinder(this); - } - - internal AdoAdapter(IConnectionProvider connectionProvider) : this() - { - _connectionProvider = connectionProvider; - _schema = DatabaseSchema.Get(_connectionProvider, _providerHelper); - _relatedFinder = new Lazy(CreateRelatedFinder); - _commandOptimizer = ProviderHelper.GetCustomProvider(_connectionProvider) ?? - new CommandOptimizer(); - } - - private AdoAdapter(IConnectionProvider connectionProvider, AdoAdapterFinder finder, ProviderHelper providerHelper, - Lazy relatedFinder, DatabaseSchema schema) - { - _connectionProvider = connectionProvider; - _finder = finder; - _providerHelper = providerHelper; - _relatedFinder = relatedFinder; - _schema = schema; - } - - public AdoOptions AdoOptions - { - get { return Options as AdoOptions; } - } - - public CommandOptimizer CommandOptimizer - { - get { return _commandOptimizer; } - } - - public ProviderHelper ProviderHelper - { - get { return _providerHelper; } - } - - public IConnectionProvider ConnectionProvider - { - get { return _connectionProvider; } - } - - internal AdoAdapterFinder Finder - { - get { return _finder; } - } - - public bool ProviderSupportsCompoundStatements - { - get { return _connectionProvider.SupportsCompoundStatements; } - } - - public ISchemaProvider SchemaProvider - { - get { return _connectionProvider.GetSchemaProvider(); } - } - - public override IDictionary GetKey(string tableName, IDictionary record) - { - var homogenizedRecord = new Dictionary(record, HomogenizedEqualityComparer.DefaultInstance); - return GetKeyNames(tableName) - .Select(k => k.Homogenize()) - .Where(homogenizedRecord.ContainsKey) - .ToDictionary(key => key, key => homogenizedRecord[key]); - } - - #region ICloneable Members - - public object Clone() - { - return new AdoAdapter(_connectionProvider) {_connectionModifier = _connectionModifier}; - } - - #endregion - - protected override void OnSetup() - { - ICollection settingsKeys = ((IDictionary) Settings).Keys; - if (settingsKeys.Contains("ConnectionString")) - { - if (settingsKeys.Contains("ProviderName")) - { - _connectionProvider = ProviderHelper.GetProviderByConnectionString(Settings.ConnectionString, - Settings.ProviderName); - } - else - { - _connectionProvider = ProviderHelper.GetProviderByConnectionString(Settings.ConnectionString); - } - } - else if (settingsKeys.Contains("Filename")) - { - _connectionProvider = ProviderHelper.GetProviderByFilename(Settings.Filename); - } - else if (settingsKeys.Contains("ConnectionName")) - { - _connectionProvider = ProviderHelper.GetProviderByConnectionName(Settings.ConnectionName); - } - _schema = DatabaseSchema.Get(_connectionProvider, _providerHelper); - _relatedFinder = new Lazy(CreateRelatedFinder); - _commandOptimizer = ProviderHelper.GetCustomProvider(_connectionProvider) ?? - new CommandOptimizer(); - } - - private AdoAdapterRelatedFinder CreateRelatedFinder() - { - return new AdoAdapterRelatedFinder(this); - } - - public override IDictionary Get(string tableName, params object[] keyValues) - { - // We don't need to implement Get because we provide a delegate for this operation... - throw new NotImplementedException(); - } - - public override IDictionary FindOne(string tableName, SimpleExpression criteria) - { - return _finder.FindOne(tableName, criteria); - } - - public override Func> CreateFindOneDelegate(string tableName, - SimpleExpression criteria) - { - return _finder.CreateFindOneDelegate(tableName, criteria); - } - - public override IEnumerable> Find(string tableName, SimpleExpression criteria) - { - return _finder.Find(tableName, criteria); - } - - public override IEnumerable> RunQuery(SimpleQuery query, - out IEnumerable - unhandledClauses) - { - return new AdoAdapterQueryRunner(this).RunQuery(query, out unhandledClauses); - } - - - public override IEnumerable>> RunQueries(SimpleQuery[] queries, - List - < - IEnumerable - > - unhandledClauses) - { - return new AdoAdapterQueryRunner(this).RunQueries(queries, unhandledClauses); - } - - public override bool IsExpressionFunction(string functionName, params object[] args) - { - return FunctionIsLikeOrNotLike(functionName, args); - } - - private static bool FunctionIsLikeOrNotLike(string functionName, object[] args) - { - return ((functionName.Equals("like", StringComparison.OrdinalIgnoreCase) - || functionName.Equals("notlike", StringComparison.OrdinalIgnoreCase)) - && args.Length == 1 - && args[0] is string); - } - - public override IObservable> RunQueryAsObservable(SimpleQuery query, - out - IEnumerable - - unhandledClauses) - { - return new AdoAdapterQueryRunner(this).RunQueryAsObservable(query, out unhandledClauses); - } - - public override IDictionary Insert(string tableName, IDictionary data, bool resultRequired) - { - return new AdoAdapterInserter(this).Insert(tableName, data, resultRequired); - } - - public override IEnumerable> InsertMany(string tableName, - IEnumerable> - data, Func, Exception, bool> onError, bool resultRequired) - { - return new AdoAdapterInserter(this).InsertMany(tableName, data, onError, resultRequired); - } - - public override int UpdateMany(string tableName, IEnumerable> data, - IEnumerable criteriaFieldNames) - { - IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? - new BulkUpdater(); - return bulkUpdater.Update(this, tableName, data.ToList(), criteriaFieldNames, null); - } - - public override int UpdateMany(string tableName, IEnumerable> data) - { - IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? - new BulkUpdater(); - return bulkUpdater.Update(this, tableName, data.ToList(), null); - } - - public override int Update(string tableName, IDictionary data, SimpleExpression criteria) - { - ICommandBuilder commandBuilder = new UpdateHelper(_schema).GetUpdateCommand(tableName, data, criteria); - return Execute(commandBuilder); - } - - /// - /// Deletes from the specified table. - /// - /// Name of the table. - /// The expression to use as criteria for the delete operation. - /// The number of records which were deleted. - public override int Delete(string tableName, SimpleExpression criteria) - { - ICommandBuilder commandBuilder = new DeleteHelper(_schema).GetDeleteCommand(tableName, criteria); - return Execute(commandBuilder); - } - - /// - /// Gets the names of the fields which comprise the unique identifier for the specified table. - /// - /// Name of the table. - /// A list of field names; an empty list if no key is defined. - public override IList GetKeyNames(string tableName) - { - return _schema.FindTable(tableName).PrimaryKey.AsEnumerable().ToList(); - } - - public void SetConnectionModifier(Func connectionModifer) - { - _connectionModifier = connectionModifer; - } - - public void ClearConnectionModifier() - { - _connectionModifier = connection => connection; - } - - private int Execute(ICommandBuilder commandBuilder) - { - IDbConnection connection = CreateConnection(); - using (connection.MaybeDisposable()) - { - using (IDbCommand command = commandBuilder.GetCommand(connection, AdoOptions)) - { - connection.OpenIfClosed(); - return command.TryExecuteNonQuery(); - } - } - } - - internal int Execute(ICommandBuilder commandBuilder, IDbConnection connection) - { - using (connection.MaybeDisposable()) - { - using (IDbCommand command = commandBuilder.GetCommand(connection, AdoOptions)) - { - connection.OpenIfClosed(); - return command.TryExecuteNonQuery(); - } - } - } - - internal int Execute(ICommandBuilder commandBuilder, IAdapterTransaction transaction) - { - IDbTransaction dbTransaction = ((AdoAdapterTransaction) transaction).DbTransaction; - return Execute(commandBuilder, dbTransaction); - } - - internal int Execute(ICommandBuilder commandBuilder, IDbTransaction dbTransaction) - { - using (IDbCommand command = commandBuilder.GetCommand(dbTransaction.Connection, AdoOptions)) - { - command.Transaction = dbTransaction; - return command.TryExecuteNonQuery(); - } - } - - public void UseSharedConnection(IDbConnection connection) - { - _sharedConnection = connection; - } - - public void StopUsingSharedConnection() - { - _sharedConnection = null; - } - - public IDbConnection CreateConnection() - { - if (_sharedConnection != null) return _sharedConnection; - var connection = _connectionModifier(_connectionProvider.CreateConnection()); - var args = ConnectionCreated.Raise(this, () => new ConnectionCreatedEventArgs(connection)); - if (args != null && args.OverriddenConnection != null) - { - return args.OverriddenConnection; - } - return connection; - } - - public DatabaseSchema GetSchema() - { - return _schema ?? (_schema = DatabaseSchema.Get(_connectionProvider, _providerHelper)); - } - - public override IDictionary Upsert(string tableName, IDictionary data, SimpleExpression criteria, bool resultRequired) - { - return new AdoAdapterUpserter(this).Upsert(tableName, data, criteria, resultRequired); - } - - public override IEnumerable> UpsertMany(string tableName, IList> list, bool isResultRequired, Func, Exception, bool> errorCallback) - { - var upserter = new AdoAdapterUpserter(this); - return upserter.UpsertMany(tableName, list, isResultRequired, errorCallback); - } - - public override IEnumerable> UpsertMany(string tableName, IList> list, IEnumerable keyFieldNames, bool isResultRequired, Func, Exception, bool> errorCallback) - { - return new AdoAdapterUpserter(this).UpsertMany(tableName, list, keyFieldNames.ToArray(), isResultRequired, errorCallback); - } - - public string GetIdentityFunction() - { - return _connectionProvider.GetIdentityFunction(); - } - - protected override void OnReset() - { - DatabaseSchema.ClearCache(); - _schema = DatabaseSchema.Get(_connectionProvider, _providerHelper); - } - - public static event EventHandler ConnectionCreated; - } - - public class ConnectionCreatedEventArgs : EventArgs - { - private readonly IDbConnection _connection; - - public ConnectionCreatedEventArgs(IDbConnection connection) - { - _connection = connection; - } - - public IDbConnection Connection - { - get { return _connection; } - } - - internal IDbConnection OverriddenConnection { get; private set; } - - public void OverrideConnection(IDbConnection overridingConnection) - { - OverriddenConnection = overridingConnection; - } - } -} +using System; +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.Data; +using System.Linq; +using Simple.Data.Ado.Schema; +using Simple.Data.Operations; + +namespace Simple.Data.Ado +{ + using Extensions; + + [Export("Ado", typeof (Adapter))] + public partial class AdoAdapter : Adapter, ICloneable + { + private readonly AdoAdapterFinder _finder; + private readonly ProviderHelper _providerHelper = new ProviderHelper(); + private CommandOptimizer _commandOptimizer = new CommandOptimizer(); + private IConnectionProvider _connectionProvider; + private Lazy _relatedFinder; + private DatabaseSchema _schema; + private IDbConnection _sharedConnection; + private Func _connectionModifier = connection => connection; + + public AdoAdapter() + { + _finder = new AdoAdapterFinder(this); + } + + internal AdoAdapter(IConnectionProvider connectionProvider) : this() + { + _connectionProvider = connectionProvider; + _schema = DatabaseSchema.Get(_connectionProvider, _providerHelper); + _relatedFinder = new Lazy(CreateRelatedFinder); + _commandOptimizer = ProviderHelper.GetCustomProvider(_connectionProvider) ?? + new CommandOptimizer(); + } + + private AdoAdapter(IConnectionProvider connectionProvider, AdoAdapterFinder finder, ProviderHelper providerHelper, + Lazy relatedFinder, DatabaseSchema schema) + { + _connectionProvider = connectionProvider; + _finder = finder; + _providerHelper = providerHelper; + _relatedFinder = relatedFinder; + _schema = schema; + } + + public AdoOptions AdoOptions + { + get { return Options as AdoOptions; } + } + + public CommandOptimizer CommandOptimizer + { + get { return _commandOptimizer; } + } + + public ProviderHelper ProviderHelper + { + get { return _providerHelper; } + } + + public IConnectionProvider ConnectionProvider + { + get { return _connectionProvider; } + } + + internal AdoAdapterFinder Finder + { + get { return _finder; } + } + + public bool ProviderSupportsCompoundStatements + { + get { return _connectionProvider.SupportsCompoundStatements; } + } + + public ISchemaProvider SchemaProvider + { + get { return _connectionProvider.GetSchemaProvider(); } + } + + public override IDictionary GetKey(string tableName, IDictionary record) + { + var homogenizedRecord = new Dictionary(record, HomogenizedEqualityComparer.DefaultInstance); + return GetKeyNames(tableName) + .Select(k => k.Homogenize()) + .Where(homogenizedRecord.ContainsKey) + .ToDictionary(key => key, key => homogenizedRecord[key]); + } + + #region ICloneable Members + + public object Clone() + { + return new AdoAdapter(_connectionProvider) {_connectionModifier = _connectionModifier}; + } + + #endregion + + protected override void OnSetup() + { + ICollection settingsKeys = ((IDictionary) Settings).Keys; + if (settingsKeys.Contains("ConnectionString")) + { + if (settingsKeys.Contains("ProviderName")) + { + _connectionProvider = ProviderHelper.GetProviderByConnectionString(Settings.ConnectionString, + Settings.ProviderName); + } + else + { + _connectionProvider = ProviderHelper.GetProviderByConnectionString(Settings.ConnectionString); + } + } + else if (settingsKeys.Contains("Filename")) + { + _connectionProvider = ProviderHelper.GetProviderByFilename(Settings.Filename); + } + else if (settingsKeys.Contains("ConnectionName")) + { + _connectionProvider = ProviderHelper.GetProviderByConnectionName(Settings.ConnectionName); + } + _schema = DatabaseSchema.Get(_connectionProvider, _providerHelper); + _relatedFinder = new Lazy(CreateRelatedFinder); + _commandOptimizer = ProviderHelper.GetCustomProvider(_connectionProvider) ?? + new CommandOptimizer(); + } + + private AdoAdapterRelatedFinder CreateRelatedFinder() + { + return new AdoAdapterRelatedFinder(this); + } + + public override IDictionary Get(GetOperation operation) + { + // We don't need to implement Get because we provide a delegate for this operation... + throw new NotImplementedException(); + } + + public override IDictionary FindOne(FindOperation operation) + { + return _finder.FindOne(operation.TableName, operation.Criteria); + } + + public override Func> CreateFindOneDelegate(string tableName, + SimpleExpression criteria) + { + return _finder.CreateFindOneDelegate(tableName, criteria); + } + + public override IEnumerable> Find(FindOperation operation) + { + return _finder.Find(operation.TableName, operation.Criteria); + } + + public override IEnumerable> RunQuery(SimpleQuery query, + out IEnumerable + unhandledClauses) + { + return new AdoAdapterQueryRunner(this).RunQuery(query, out unhandledClauses); + } + + + public override IEnumerable>> RunQueries(SimpleQuery[] queries, + List + < + IEnumerable + > + unhandledClauses) + { + return new AdoAdapterQueryRunner(this).RunQueries(queries, unhandledClauses); + } + + public override bool IsExpressionFunction(string functionName, params object[] args) + { + return FunctionIsLikeOrNotLike(functionName, args); + } + + private static bool FunctionIsLikeOrNotLike(string functionName, object[] args) + { + return ((functionName.Equals("like", StringComparison.OrdinalIgnoreCase) + || functionName.Equals("notlike", StringComparison.OrdinalIgnoreCase)) + && args.Length == 1 + && args[0] is string); + } + + public override IObservable> RunQueryAsObservable(SimpleQuery query, + out + IEnumerable + + unhandledClauses) + { + return new AdoAdapterQueryRunner(this).RunQueryAsObservable(query, out unhandledClauses); + } + + public override IDictionary Insert(string tableName, IDictionary data, bool resultRequired) + { + return new AdoAdapterInserter(this).Insert(tableName, data, resultRequired); + } + + public override IEnumerable> InsertMany(string tableName, + IEnumerable> + data, Func, Exception, bool> onError, bool resultRequired) + { + return new AdoAdapterInserter(this).InsertMany(tableName, data, onError, resultRequired); + } + + public override int UpdateMany(string tableName, IEnumerable> data, + IEnumerable criteriaFieldNames) + { + IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? + new BulkUpdater(); + return bulkUpdater.Update(this, tableName, data.ToList(), criteriaFieldNames, null); + } + + public override int UpdateMany(string tableName, IEnumerable> data) + { + IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? + new BulkUpdater(); + return bulkUpdater.Update(this, tableName, data.ToList(), null); + } + + public override int Update(string tableName, IDictionary data, SimpleExpression criteria) + { + ICommandBuilder commandBuilder = new UpdateHelper(_schema).GetUpdateCommand(tableName, data, criteria); + return Execute(commandBuilder); + } + + /// + /// Deletes from the specified table. + /// + /// Name of the table. + /// The expression to use as criteria for the delete operation. + /// The number of records which were deleted. + public override int Delete(string tableName, SimpleExpression criteria) + { + ICommandBuilder commandBuilder = new DeleteHelper(_schema).GetDeleteCommand(tableName, criteria); + return Execute(commandBuilder); + } + + /// + /// Gets the names of the fields which comprise the unique identifier for the specified table. + /// + /// Name of the table. + /// A list of field names; an empty list if no key is defined. + public override IList GetKeyNames(string tableName) + { + return _schema.FindTable(tableName).PrimaryKey.AsEnumerable().ToList(); + } + + public void SetConnectionModifier(Func connectionModifer) + { + _connectionModifier = connectionModifer; + } + + public void ClearConnectionModifier() + { + _connectionModifier = connection => connection; + } + + private int Execute(ICommandBuilder commandBuilder) + { + IDbConnection connection = CreateConnection(); + using (connection.MaybeDisposable()) + { + using (IDbCommand command = commandBuilder.GetCommand(connection, AdoOptions)) + { + connection.OpenIfClosed(); + return command.TryExecuteNonQuery(); + } + } + } + + internal int Execute(ICommandBuilder commandBuilder, IDbConnection connection) + { + using (connection.MaybeDisposable()) + { + using (IDbCommand command = commandBuilder.GetCommand(connection, AdoOptions)) + { + connection.OpenIfClosed(); + return command.TryExecuteNonQuery(); + } + } + } + + internal int Execute(ICommandBuilder commandBuilder, IAdapterTransaction transaction) + { + IDbTransaction dbTransaction = ((AdoAdapterTransaction) transaction).DbTransaction; + return Execute(commandBuilder, dbTransaction); + } + + internal int Execute(ICommandBuilder commandBuilder, IDbTransaction dbTransaction) + { + using (IDbCommand command = commandBuilder.GetCommand(dbTransaction.Connection, AdoOptions)) + { + command.Transaction = dbTransaction; + return command.TryExecuteNonQuery(); + } + } + + public void UseSharedConnection(IDbConnection connection) + { + _sharedConnection = connection; + } + + public void StopUsingSharedConnection() + { + _sharedConnection = null; + } + + public IDbConnection CreateConnection() + { + if (_sharedConnection != null) return _sharedConnection; + var connection = _connectionModifier(_connectionProvider.CreateConnection()); + var args = ConnectionCreated.Raise(this, () => new ConnectionCreatedEventArgs(connection)); + if (args != null && args.OverriddenConnection != null) + { + return args.OverriddenConnection; + } + return connection; + } + + public DatabaseSchema GetSchema() + { + return _schema ?? (_schema = DatabaseSchema.Get(_connectionProvider, _providerHelper)); + } + + public override IDictionary Upsert(string tableName, IDictionary data, SimpleExpression criteria, bool resultRequired) + { + return new AdoAdapterUpserter(this).Upsert(tableName, data, criteria, resultRequired); + } + + public override IEnumerable> UpsertMany(string tableName, IList> list, bool isResultRequired, Func, Exception, bool> errorCallback) + { + var upserter = new AdoAdapterUpserter(this); + return upserter.UpsertMany(tableName, list, isResultRequired, errorCallback); + } + + public override IEnumerable> UpsertMany(string tableName, IList> list, IEnumerable keyFieldNames, bool isResultRequired, Func, Exception, bool> errorCallback) + { + return new AdoAdapterUpserter(this).UpsertMany(tableName, list, keyFieldNames.ToArray(), isResultRequired, errorCallback); + } + + public string GetIdentityFunction() + { + return _connectionProvider.GetIdentityFunction(); + } + + protected override void OnReset() + { + DatabaseSchema.ClearCache(); + _schema = DatabaseSchema.Get(_connectionProvider, _providerHelper); + } + + public static event EventHandler ConnectionCreated; + } + + public class ConnectionCreatedEventArgs : EventArgs + { + private readonly IDbConnection _connection; + + public ConnectionCreatedEventArgs(IDbConnection connection) + { + _connection = connection; + } + + public IDbConnection Connection + { + get { return _connection; } + } + + internal IDbConnection OverriddenConnection { get; private set; } + + public void OverrideConnection(IDbConnection overridingConnection) + { + OverriddenConnection = overridingConnection; + } + } +} diff --git a/Simple.Data.Ado/AdoAdapterRelatedFinder.cs b/Simple.Data.Ado/AdoAdapterRelatedFinder.cs index 8e1426f3..0c2af6f4 100644 --- a/Simple.Data.Ado/AdoAdapterRelatedFinder.cs +++ b/Simple.Data.Ado/AdoAdapterRelatedFinder.cs @@ -1,79 +1,80 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using Simple.Data.Ado.Schema; - -namespace Simple.Data.Ado -{ - class AdoAdapterRelatedFinder - { - private readonly Lazy, TableJoin>> _tableJoins = - new Lazy, TableJoin>>( - () => new ConcurrentDictionary, TableJoin>(), LazyThreadSafetyMode.ExecutionAndPublication - ); - - private readonly AdoAdapter _adapter; - - public AdoAdapterRelatedFinder(AdoAdapter adapter) - { - _adapter = adapter; - } - - public bool IsValidRelation(string tableName, string relatedTableName) - { - return TryJoin(tableName, relatedTableName) != null; - } - - public object FindRelated(string tableName, IDictionary row, string relatedTableName) - { - var join = TryJoin(tableName, relatedTableName); - if (join == null) throw new AdoAdapterException(string.Format("Could not resolve relationship of tables '{0}' and '{1}'.", tableName, relatedTableName)); - - if (join.Master == _adapter.GetSchema().FindTable(tableName)) - { - return GetDetail(row, join); - } - return GetMaster(row, join); - } - - private TableJoin TryJoin(string tableName, string relatedTableName) - { - return _tableJoins.Value.GetOrAdd(Tuple.Create(tableName, relatedTableName), - t => TryCreateJoin(t.Item1, t.Item2)); - } - - private TableJoin TryCreateJoin(string tableName, string relatedTableName) - { - return TryMasterJoin(tableName, relatedTableName) ?? TryDetailJoin(tableName, relatedTableName); - } - - private TableJoin TryMasterJoin(string tableName, string relatedTableName) - { - return _adapter.GetSchema().FindTable(tableName).GetMaster(relatedTableName); - } - - private TableJoin TryDetailJoin(string tableName, string relatedTableName) - { - return _adapter.GetSchema().FindTable(tableName).GetDetail(relatedTableName); - } - - private IDictionary GetMaster(IDictionary row, TableJoin masterJoin) - { - var criteria = new Dictionary { { masterJoin.MasterColumn.ActualName, row[masterJoin.DetailColumn.HomogenizedName] } }; - return _adapter.Find(masterJoin.Master.ActualName, - ExpressionHelper.CriteriaDictionaryToExpression(masterJoin.Master.ActualName, - criteria)).FirstOrDefault(); - } - - private SimpleQuery GetDetail(IDictionary row, TableJoin join) - { - var criteria = ExpressionHelper.CriteriaDictionaryToExpression(join.Detail.ActualName, - new Dictionary - {{join.DetailColumn.ActualName, row[join.MasterColumn.HomogenizedName]}}); - return new SimpleQuery(_adapter, null, join.Detail.ActualName).Where(criteria); - } - } -} +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using Simple.Data.Ado.Schema; +using Simple.Data.Operations; + +namespace Simple.Data.Ado +{ + class AdoAdapterRelatedFinder + { + private readonly Lazy, TableJoin>> _tableJoins = + new Lazy, TableJoin>>( + () => new ConcurrentDictionary, TableJoin>(), LazyThreadSafetyMode.ExecutionAndPublication + ); + + private readonly AdoAdapter _adapter; + + public AdoAdapterRelatedFinder(AdoAdapter adapter) + { + _adapter = adapter; + } + + public bool IsValidRelation(string tableName, string relatedTableName) + { + return TryJoin(tableName, relatedTableName) != null; + } + + public object FindRelated(string tableName, IDictionary row, string relatedTableName) + { + var join = TryJoin(tableName, relatedTableName); + if (join == null) throw new AdoAdapterException(string.Format("Could not resolve relationship of tables '{0}' and '{1}'.", tableName, relatedTableName)); + + if (join.Master == _adapter.GetSchema().FindTable(tableName)) + { + return GetDetail(row, join); + } + return GetMaster(row, join); + } + + private TableJoin TryJoin(string tableName, string relatedTableName) + { + return _tableJoins.Value.GetOrAdd(Tuple.Create(tableName, relatedTableName), + t => TryCreateJoin(t.Item1, t.Item2)); + } + + private TableJoin TryCreateJoin(string tableName, string relatedTableName) + { + return TryMasterJoin(tableName, relatedTableName) ?? TryDetailJoin(tableName, relatedTableName); + } + + private TableJoin TryMasterJoin(string tableName, string relatedTableName) + { + return _adapter.GetSchema().FindTable(tableName).GetMaster(relatedTableName); + } + + private TableJoin TryDetailJoin(string tableName, string relatedTableName) + { + return _adapter.GetSchema().FindTable(tableName).GetDetail(relatedTableName); + } + + private IDictionary GetMaster(IDictionary row, TableJoin masterJoin) + { + var criteria = new Dictionary { { masterJoin.MasterColumn.ActualName, row[masterJoin.DetailColumn.HomogenizedName] } }; + return _adapter.Find(new FindOperation(masterJoin.Master.ActualName, + ExpressionHelper.CriteriaDictionaryToExpression(masterJoin.Master.ActualName, + criteria))).FirstOrDefault(); + } + + private SimpleQuery GetDetail(IDictionary row, TableJoin join) + { + var criteria = ExpressionHelper.CriteriaDictionaryToExpression(join.Detail.ActualName, + new Dictionary + {{join.DetailColumn.ActualName, row[join.MasterColumn.HomogenizedName]}}); + return new SimpleQuery(_adapter, null, join.Detail.ActualName).Where(criteria); + } + } +} diff --git a/Simple.Data.Ado/AdoOptimizingDelegateFactory.cs b/Simple.Data.Ado/AdoOptimizingDelegateFactory.cs index b37be85c..6f3a12e3 100644 --- a/Simple.Data.Ado/AdoOptimizingDelegateFactory.cs +++ b/Simple.Data.Ado/AdoOptimizingDelegateFactory.cs @@ -1,23 +1,24 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Simple.Data.Ado -{ - using System.ComponentModel.Composition; - - [Export(typeof(OptimizingDelegateFactory))] - public class AdoOptimizingDelegateFactory : OptimizingDelegateFactory - { - public override Func> CreateFindOneDelegate(Adapter adapter, string tableName, SimpleExpression criteria) - { - return new AdoAdapterFinder((AdoAdapter)adapter).CreateFindOneDelegate(tableName, criteria); - } - - public override Func> CreateGetDelegate(Adapter adapter, string tableName, object[] keyValues) - { - return new AdoAdapterGetter((AdoAdapter) adapter).CreateGetDelegate(tableName, keyValues); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Simple.Data.Operations; + +namespace Simple.Data.Ado +{ + using System.ComponentModel.Composition; + + [Export(typeof(OptimizingDelegateFactory))] + public class AdoOptimizingDelegateFactory : OptimizingDelegateFactory + { + public override Func> CreateFindOneDelegate(Adapter adapter, string tableName, SimpleExpression criteria) + { + return new AdoAdapterFinder((AdoAdapter)adapter).CreateFindOneDelegate(tableName, criteria); + } + + public override Func> CreateGetDelegate(Adapter adapter, GetOperation operation) + { + return new AdoAdapterGetter((AdoAdapter) adapter).CreateGetDelegate(operation.TableName, operation.KeyValues); + } + } +} diff --git a/Simple.Data.Ado/Properties/Settings.Designer.cs b/Simple.Data.Ado/Properties/Settings.Designer.cs index 2dc405a0..3f6646c0 100644 --- a/Simple.Data.Ado/Properties/Settings.Designer.cs +++ b/Simple.Data.Ado/Properties/Settings.Designer.cs @@ -1,35 +1,35 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.1 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Simple.Data.Ado.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - - [global::System.Configuration.ApplicationScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("dbo")] - public string DefaultSchema { - get { - return ((string)(this["DefaultSchema"])); - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.18331 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Simple.Data.Ado.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("dbo")] + public string DefaultSchema { + get { + return ((string)(this["DefaultSchema"])); + } + } + } +} diff --git a/Simple.Data.Ado/Simple.Data.Ado.csproj b/Simple.Data.Ado/Simple.Data.Ado.csproj index 9aaa0903..b91ba8ab 100644 --- a/Simple.Data.Ado/Simple.Data.Ado.csproj +++ b/Simple.Data.Ado/Simple.Data.Ado.csproj @@ -11,6 +11,8 @@ Simple.Data.Ado Simple.Data.Ado 512 + v4.5 + true @@ -21,6 +23,7 @@ prompt 4 SecurityRules.ruleset + false pdbonly @@ -29,6 +32,7 @@ TRACE prompt 4 + false pdbonly @@ -37,6 +41,7 @@ TRACE prompt 4 + false diff --git a/Simple.Data.Ado/app.config b/Simple.Data.Ado/app.config index 61751f73..9c05236b 100644 --- a/Simple.Data.Ado/app.config +++ b/Simple.Data.Ado/app.config @@ -1,15 +1,15 @@ - - - - -
- - - - - - dbo - - - - \ No newline at end of file + + + + +
+ + + + + + dbo + + + + diff --git a/Simple.Data.BehaviourTest/App.config b/Simple.Data.BehaviourTest/App.config index a718d8bf..644ed2bb 100644 --- a/Simple.Data.BehaviourTest/App.config +++ b/Simple.Data.BehaviourTest/App.config @@ -1,14 +1,14 @@ - - - - -
- - - - - - - - - \ No newline at end of file + + + + +
+ + + + + + + + + diff --git a/Simple.Data.BehaviourTest/Simple.Data.BehaviourTest.csproj b/Simple.Data.BehaviourTest/Simple.Data.BehaviourTest.csproj index caca7c23..ebcf6ca6 100644 --- a/Simple.Data.BehaviourTest/Simple.Data.BehaviourTest.csproj +++ b/Simple.Data.BehaviourTest/Simple.Data.BehaviourTest.csproj @@ -1,125 +1,130 @@ - - - - Debug - AnyCPU - - - 2.0 - {70536BA8-AF0D-46F3-B04C-45177F56B320} - Library - Properties - Simple.Data.IntegrationTest - Simple.Data.IntegrationTest - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - 3.5 - - - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll - - - ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll - - - - - - False - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} - Simple.Data.Ado - - - {292611F6-BBBD-492D-891C-0D9FB4BF5433} - Simple.Data.Mocking - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - - - - - - - + + + + Debug + AnyCPU + + + 2.0 + {70536BA8-AF0D-46F3-B04C-45177F56B320} + Library + Properties + Simple.Data.IntegrationTest + Simple.Data.IntegrationTest + 512 + v4.5 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + 3.5 + + + + + ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll + + + ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll + + + ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} + Simple.Data.Ado + + + {292611f6-bbbd-492d-891c-0d9fb4bf5433} + Simple.Data.Mocking + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + + + + + + + \ No newline at end of file diff --git a/Simple.Data.BehaviourTest/packages.config b/Simple.Data.BehaviourTest/packages.config index 27a38197..0c821784 100644 --- a/Simple.Data.BehaviourTest/packages.config +++ b/Simple.Data.BehaviourTest/packages.config @@ -1,4 +1,4 @@ - - - + + + \ No newline at end of file diff --git a/Simple.Data.InMemoryTest/Simple.Data.InMemoryTest.csproj b/Simple.Data.InMemoryTest/Simple.Data.InMemoryTest.csproj index 9ef4977c..189b0804 100644 --- a/Simple.Data.InMemoryTest/Simple.Data.InMemoryTest.csproj +++ b/Simple.Data.InMemoryTest/Simple.Data.InMemoryTest.csproj @@ -1,82 +1,87 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {1B6A87C0-4ACA-4411-8879-844537A52126} - Library - Properties - Simple.Data.InMemoryTest - Simple.Data.InMemoryTest - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll - - - ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll - - - - - - - - - - - - - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - - + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {1B6A87C0-4ACA-4411-8879-844537A52126} + Library + Properties + Simple.Data.InMemoryTest + Simple.Data.InMemoryTest + 512 + v4.5 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll + + + ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll + + + ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll + + + + + + + + + + + + + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + + \ No newline at end of file diff --git a/Simple.Data.InMemoryTest/packages.config b/Simple.Data.InMemoryTest/packages.config index 27a38197..0c821784 100644 --- a/Simple.Data.InMemoryTest/packages.config +++ b/Simple.Data.InMemoryTest/packages.config @@ -1,4 +1,4 @@ - - - + + + \ No newline at end of file diff --git a/Simple.Data.Mocking.Test/Simple.Data.Mocking.Test.csproj b/Simple.Data.Mocking.Test/Simple.Data.Mocking.Test.csproj index b1f4f073..ec6755b3 100644 --- a/Simple.Data.Mocking.Test/Simple.Data.Mocking.Test.csproj +++ b/Simple.Data.Mocking.Test/Simple.Data.Mocking.Test.csproj @@ -1,85 +1,81 @@ - - - - Debug - AnyCPU - - - 2.0 - {D4FE470E-4B01-4120-B809-F426A0179191} - Library - Properties - Simple.Data.Mocking.Test - Simple.Data.Mocking.Test - v4.0 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll - - - ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll - - - - 3.5 - - - - - - - - - False - - - - - - - - - - {292611F6-BBBD-492D-891C-0D9FB4BF5433} - Simple.Data.Mocking - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - - - - - + + + + Debug + AnyCPU + + + 2.0 + {D4FE470E-4B01-4120-B809-F426A0179191} + Library + Properties + Simple.Data.Mocking.Test + Simple.Data.Mocking.Test + v4.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll + + + ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll + + + ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll + + + + 3.5 + + + + + + + + + False + + + + + + + + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + + + + + \ No newline at end of file diff --git a/Simple.Data.Mocking/Simple.Data.Mocking.csproj b/Simple.Data.Mocking/Simple.Data.Mocking.csproj index a128b3f1..953c243e 100644 --- a/Simple.Data.Mocking/Simple.Data.Mocking.csproj +++ b/Simple.Data.Mocking/Simple.Data.Mocking.csproj @@ -1,94 +1,98 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {292611F6-BBBD-492D-891C-0D9FB4BF5433} - Library - Properties - Simple.Data.Mocking - Simple.Data.Mocking - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - CommonAssemblyInfo.cs - - - - - - - - - - - Component - - - Component - - - - - - - - - - - - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} - Simple.Data.Ado - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - - + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {292611F6-BBBD-492D-891C-0D9FB4BF5433} + Library + Properties + Simple.Data.Mocking + Simple.Data.Mocking + 512 + v4.5 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + + + + CommonAssemblyInfo.cs + + + + + + + + + + + Component + + + Component + + + + + + + + + + + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} + Simple.Data.Ado + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + + \ No newline at end of file diff --git a/Simple.Data.Mocking/XmlMockAdapter.cs b/Simple.Data.Mocking/XmlMockAdapter.cs index 36ee72c3..70bf861b 100644 --- a/Simple.Data.Mocking/XmlMockAdapter.cs +++ b/Simple.Data.Mocking/XmlMockAdapter.cs @@ -1,195 +1,196 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Xml.Linq; - -namespace Simple.Data.Mocking -{ - public class XmlMockAdapter : Adapter, IAdapterWithRelation - { - private readonly Lazy _data; - - public XmlMockAdapter(XElement element) - { - _data = new Lazy(() => element); - } - - public XmlMockAdapter(string xml) - { - _data = new Lazy(() => XElement.Parse(xml)); - } - - public XElement Data - { - get { return _data.Value; } - } - - public override IDictionary GetKey(string tableName, IDictionary record) - { - return GetKeyFieldNames(tableName).ToDictionary(key => key, - key => record.ContainsKey(key) ? record[key] : null); - } - - public override IList GetKeyNames(string tableName) - { - return GetKeyFieldNames(tableName).ToList(); - } - - public override IDictionary Get(string tableName, params object[] keyValues) - { - throw new NotImplementedException(); - } - - public override IEnumerable> Find(string tableName, SimpleExpression criteria) - { - if (criteria == null) return FindAll(tableName); - return GetTableElement(tableName).Elements() - .Where(XmlPredicateBuilder.GetPredicate(criteria)) - .Select(e => e.AttributesToDictionary()); - } - - public override IEnumerable> RunQuery(SimpleQuery query, out IEnumerable unhandledClauses) - { - unhandledClauses = Enumerable.Empty(); - var criteria = query.Clauses.OfType().Aggregate(SimpleExpression.Empty, - (seed, where) => seed && where.Criteria); - return Find(query.TableName, criteria); - } - - public override IDictionary Insert(string tableName, IDictionary data, bool resultRequired) - { - var tableElement = GetTableElement(tableName); - if (tableElement == null) - { - tableElement = new XElement(tableName); - Data.Add(tableElement); - } - var rowNameElement = tableElement.Elements().FirstOrDefault(); - var rowName = rowNameElement != null ? rowNameElement.Name : tableName + "_row"; - var element = new XElement(rowName); - foreach (var kvp in data) - { - element.Add(new XAttribute(kvp.Key, kvp.Value)); - } - tableElement.Add(element); - return data; - } - - public override int Update(string tableName, IDictionary data, SimpleExpression criteria) - { - int updated = 0; - var elementsToUpdate = GetTableElement(tableName).Elements() - .Where(XmlPredicateBuilder.GetPredicate(criteria)); - - foreach (var element in elementsToUpdate) - { - foreach (var kvp in data) - { - var attribute = element.TryGetAttribute(kvp.Key); - if (attribute != null) - { - attribute.Value = kvp.Value.ToString(); - } - else - { - element.SetAttributeValue(kvp.Key, kvp.Value); - } - } - updated++; - } - - return updated; - } - - /// - /// Deletes from the specified table. - /// - /// Name of the table. - /// The expression to use as criteria for the delete operation. - /// The number of records which were deleted. - public override int Delete(string tableName, SimpleExpression criteria) - { - var elementsToDelete = GetTableElement(tableName).Elements() - .Where(XmlPredicateBuilder.GetPredicate(criteria)) - .ToList(); - int deleted = elementsToDelete.Count; - foreach (var element in elementsToDelete) - { - element.Remove(); - } - return deleted; - } - - public override IEnumerable>> RunQueries(SimpleQuery[] queries, List> unhandledClauses) - { - foreach (var query in queries) - { - IEnumerable unhandledClausesForThisQuery; - var result = RunQuery(query, out unhandledClausesForThisQuery); - unhandledClauses.Add(unhandledClausesForThisQuery); - yield return result; - } - } - - public override bool IsExpressionFunction(string functionName, params object[] args) - { - return false; - } - - private IEnumerable> FindAll(string tableName) - { - return GetTableElement(tableName).Elements().Select(e => e.AttributesToDictionary()); - } - - private XElement GetTableElement(string tableName) - { - XElement tableElement = Data.Element(tableName); - if (tableElement == null) throw new UnresolvableObjectException(tableName, string.Format("Table '{0}' not found.", tableName)); - return tableElement; - } - - /// - /// Determines whether a relation is valid. - /// - /// Name of the known table. - /// Name of the table to test. - /// - /// true if there is a valid relation; otherwise, false. - /// - public bool IsValidRelation(string tableName, string relatedTableName) - { - return GetTableElement(tableName).Elements().Any(e => e.Element(relatedTableName) != null); - } - - /// - /// Finds data from a "table" related to the specified "table". - /// - /// Name of the table. - /// - /// - /// The list of records matching the criteria. If no records are found, return an empty list. - /// When implementing the interface, if relationships are not possible, throw a . - public object FindRelated(string tableName, IDictionary row, string relatedTableName) - { - var criteria = ExpressionHelper.CriteriaDictionaryToExpression(tableName, row); - var relatedTableElement = GetTableElement(tableName).Elements() - .Where(XmlPredicateBuilder.GetPredicate(criteria)) - .Single() - .Element(relatedTableName); - - if (relatedTableElement != null && relatedTableElement.HasElements) - { - return relatedTableElement.Elements().Select(e => e.AttributesToDictionary()); - } - - return Enumerable.Empty>(); - } - - private IEnumerable GetKeyFieldNames(string tableName) - { - var keyAttribute = GetTableElement(tableName).Attribute("_keys"); - if (keyAttribute == null) return Enumerable.Empty(); - return keyAttribute.Value.Split(','); - } - } +using System; +using System.Collections.Generic; +using System.Linq; +using System.Xml.Linq; +using Simple.Data.Operations; + +namespace Simple.Data.Mocking +{ + public class XmlMockAdapter : Adapter, IAdapterWithRelation + { + private readonly Lazy _data; + + public XmlMockAdapter(XElement element) + { + _data = new Lazy(() => element); + } + + public XmlMockAdapter(string xml) + { + _data = new Lazy(() => XElement.Parse(xml)); + } + + public XElement Data + { + get { return _data.Value; } + } + + public override IDictionary GetKey(string tableName, IDictionary record) + { + return GetKeyFieldNames(tableName).ToDictionary(key => key, + key => record.ContainsKey(key) ? record[key] : null); + } + + public override IList GetKeyNames(string tableName) + { + return GetKeyFieldNames(tableName).ToList(); + } + + public override IDictionary Get(GetOperation operation) + { + throw new NotImplementedException(); + } + + public override IEnumerable> Find(string tableName, SimpleExpression criteria) + { + if (criteria == null) return FindAll(tableName); + return GetTableElement(tableName).Elements() + .Where(XmlPredicateBuilder.GetPredicate(criteria)) + .Select(e => e.AttributesToDictionary()); + } + + public override IEnumerable> RunQuery(SimpleQuery query, out IEnumerable unhandledClauses) + { + unhandledClauses = Enumerable.Empty(); + var criteria = query.Clauses.OfType().Aggregate(SimpleExpression.Empty, + (seed, where) => seed && where.Criteria); + return Find(query.TableName, criteria); + } + + public override IDictionary Insert(string tableName, IDictionary data, bool resultRequired) + { + var tableElement = GetTableElement(tableName); + if (tableElement == null) + { + tableElement = new XElement(tableName); + Data.Add(tableElement); + } + var rowNameElement = tableElement.Elements().FirstOrDefault(); + var rowName = rowNameElement != null ? rowNameElement.Name : tableName + "_row"; + var element = new XElement(rowName); + foreach (var kvp in data) + { + element.Add(new XAttribute(kvp.Key, kvp.Value)); + } + tableElement.Add(element); + return data; + } + + public override int Update(string tableName, IDictionary data, SimpleExpression criteria) + { + int updated = 0; + var elementsToUpdate = GetTableElement(tableName).Elements() + .Where(XmlPredicateBuilder.GetPredicate(criteria)); + + foreach (var element in elementsToUpdate) + { + foreach (var kvp in data) + { + var attribute = element.TryGetAttribute(kvp.Key); + if (attribute != null) + { + attribute.Value = kvp.Value.ToString(); + } + else + { + element.SetAttributeValue(kvp.Key, kvp.Value); + } + } + updated++; + } + + return updated; + } + + /// + /// Deletes from the specified table. + /// + /// Name of the table. + /// The expression to use as criteria for the delete operation. + /// The number of records which were deleted. + public override int Delete(string tableName, SimpleExpression criteria) + { + var elementsToDelete = GetTableElement(tableName).Elements() + .Where(XmlPredicateBuilder.GetPredicate(criteria)) + .ToList(); + int deleted = elementsToDelete.Count; + foreach (var element in elementsToDelete) + { + element.Remove(); + } + return deleted; + } + + public override IEnumerable>> RunQueries(SimpleQuery[] queries, List> unhandledClauses) + { + foreach (var query in queries) + { + IEnumerable unhandledClausesForThisQuery; + var result = RunQuery(query, out unhandledClausesForThisQuery); + unhandledClauses.Add(unhandledClausesForThisQuery); + yield return result; + } + } + + public override bool IsExpressionFunction(string functionName, params object[] args) + { + return false; + } + + private IEnumerable> FindAll(string tableName) + { + return GetTableElement(tableName).Elements().Select(e => e.AttributesToDictionary()); + } + + private XElement GetTableElement(string tableName) + { + XElement tableElement = Data.Element(tableName); + if (tableElement == null) throw new UnresolvableObjectException(tableName, string.Format("Table '{0}' not found.", tableName)); + return tableElement; + } + + /// + /// Determines whether a relation is valid. + /// + /// Name of the known table. + /// Name of the table to test. + /// + /// true if there is a valid relation; otherwise, false. + /// + public bool IsValidRelation(string tableName, string relatedTableName) + { + return GetTableElement(tableName).Elements().Any(e => e.Element(relatedTableName) != null); + } + + /// + /// Finds data from a "table" related to the specified "table". + /// + /// Name of the table. + /// + /// + /// The list of records matching the criteria. If no records are found, return an empty list. + /// When implementing the interface, if relationships are not possible, throw a . + public object FindRelated(string tableName, IDictionary row, string relatedTableName) + { + var criteria = ExpressionHelper.CriteriaDictionaryToExpression(tableName, row); + var relatedTableElement = GetTableElement(tableName).Elements() + .Where(XmlPredicateBuilder.GetPredicate(criteria)) + .Single() + .Element(relatedTableName); + + if (relatedTableElement != null && relatedTableElement.HasElements) + { + return relatedTableElement.Elements().Select(e => e.AttributesToDictionary()); + } + + return Enumerable.Empty>(); + } + + private IEnumerable GetKeyFieldNames(string tableName) + { + var keyAttribute = GetTableElement(tableName).Attribute("_keys"); + if (keyAttribute == null) return Enumerable.Empty(); + return keyAttribute.Value.Split(','); + } + } } \ No newline at end of file diff --git a/Simple.Data.SqlCe40/Properties/Resources.Designer.cs b/Simple.Data.SqlCe40/Properties/Resources.Designer.cs index e5e8d27a..33a07676 100644 --- a/Simple.Data.SqlCe40/Properties/Resources.Designer.cs +++ b/Simple.Data.SqlCe40/Properties/Resources.Designer.cs @@ -1,90 +1,90 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.1 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Simple.Data.SqlCe40.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Simple.Data.SqlCe40.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to select rc.CONSTRAINT_NAME, fkcu.TABLE_SCHEMA, fkcu.TABLE_NAME, fkcu.COLUMN_NAME, - ///pkcu.TABLE_SCHEMA AS UNIQUE_TABLE_SCHEMA, pkcu.TABLE_NAME AS UNIQUE_TABLE_NAME, pkcu.COLUMN_NAME AS UNIQUE_COLUMN_NAME, - ///fkcu.ORDINAL_POSITION - ///FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc - ///JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE fkcu ON rc.CONSTRAINT_NAME = fkcu.CONSTRAINT_NAME - ///JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE pkcu ON rc.UNIQUE_CONSTRAINT_NAME = pkcu.CONSTRAINT_NAME - ///WHERE fkcu.ORDINAL_POSITION = pkcu.ORDINAL_ [rest of string was truncated]";. - /// - internal static string ForeignKeysSql { - get { - return ResourceManager.GetString("ForeignKeysSql", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.CONSTRAINT_NAME, tc.CONSTRAINT_TYPE, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION - ///FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc INNER JOIN - /// INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS kcu ON kcu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME AND kcu.TABLE_NAME = tc.TABLE_NAME - ///WHERE (tc.CONSTRAINT_TYPE = 'PRIMARY KEY'). - /// - internal static string PrimaryKeySql { - get { - return ResourceManager.GetString("PrimaryKeySql", resourceCulture); - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.18331 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Simple.Data.SqlCe40.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Simple.Data.SqlCe40.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to select rc.CONSTRAINT_NAME, fkcu.TABLE_SCHEMA, fkcu.TABLE_NAME, fkcu.COLUMN_NAME, + ///pkcu.TABLE_SCHEMA AS UNIQUE_TABLE_SCHEMA, pkcu.TABLE_NAME AS UNIQUE_TABLE_NAME, pkcu.COLUMN_NAME AS UNIQUE_COLUMN_NAME, + ///fkcu.ORDINAL_POSITION + ///FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc + ///JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE fkcu ON rc.CONSTRAINT_NAME = fkcu.CONSTRAINT_NAME + ///JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE pkcu ON rc.UNIQUE_CONSTRAINT_NAME = pkcu.CONSTRAINT_NAME + ///WHERE fkcu.ORDINAL_POSITION = pkcu.ORDINAL_ [rest of string was truncated]";. + /// + internal static string ForeignKeysSql { + get { + return ResourceManager.GetString("ForeignKeysSql", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SELECT kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.CONSTRAINT_NAME, tc.CONSTRAINT_TYPE, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION + ///FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc INNER JOIN + /// INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS kcu ON kcu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME AND kcu.TABLE_NAME = tc.TABLE_NAME + ///WHERE (tc.CONSTRAINT_TYPE = 'PRIMARY KEY'). + /// + internal static string PrimaryKeySql { + get { + return ResourceManager.GetString("PrimaryKeySql", resourceCulture); + } + } + } +} diff --git a/Simple.Data.SqlCe40/Simple.Data.SqlCe40.csproj b/Simple.Data.SqlCe40/Simple.Data.SqlCe40.csproj index 4d53348a..bf34e860 100644 --- a/Simple.Data.SqlCe40/Simple.Data.SqlCe40.csproj +++ b/Simple.Data.SqlCe40/Simple.Data.SqlCe40.csproj @@ -1,103 +1,106 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539} - Library - Properties - Simple.Data.SqlCe40 - Simple.Data.SqlCe40 - v4.0 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - True - ..\packages\SqlServerCompact.4.0.8482.1\lib\System.Data.SqlServerCe.dll - - - - - - - - - - CommonAssemblyInfo.cs - - - - - True - True - Resources.resx - - - - - - - - - - - - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} - Simple.Data.Ado - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - - - - - - ResXFileCodeGenerator - Resources.Designer.cs - - - - - - - - - - - - - - + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539} + Library + Properties + Simple.Data.SqlCe40 + Simple.Data.SqlCe40 + v4.5 + 512 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + True + ..\packages\SqlServerCompact.4.0.8482.1\lib\System.Data.SqlServerCe.dll + + + + + + + + + + CommonAssemblyInfo.cs + + + + + True + True + Resources.resx + + + + + + + + + + + + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} + Simple.Data.Ado + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Simple.Data.SqlCe40/packages.config b/Simple.Data.SqlCe40/packages.config index 47faa017..bdae535e 100644 --- a/Simple.Data.SqlCe40/packages.config +++ b/Simple.Data.SqlCe40/packages.config @@ -1,4 +1,4 @@ - - - + + + \ No newline at end of file diff --git a/Simple.Data.SqlCe40Test/Simple.Data.SqlCe40Test.csproj b/Simple.Data.SqlCe40Test/Simple.Data.SqlCe40Test.csproj index 4a2921c0..82a36ba3 100644 --- a/Simple.Data.SqlCe40Test/Simple.Data.SqlCe40Test.csproj +++ b/Simple.Data.SqlCe40Test/Simple.Data.SqlCe40Test.csproj @@ -1,159 +1,162 @@ - - - - Debug - AnyCPU - - - 2.0 - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB} - Library - Properties - Simple.Data.SqlCe40Test - Simple.Data.SqlCe40Test - v4.0 - 512 - false - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll - - - ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll - - - - - - - - - - - - False - - - - - - - - - - - - - - - - - - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} - Simple.Data.Ado - - - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539} - Simple.Data.SqlCe40 - - - {7DAB2F13-0392-435E-A934-4567266714BF} - Simple.Data.TestHelper - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - - - Always - - - Always - - - - - False - Microsoft .NET Framework 4 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - False - SQL Server Compact 3.5 SP2 - true - - - False - Windows Installer 3.1 - true - - - - - - - - - ..\..\ - - + + + + Debug + AnyCPU + + + 2.0 + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB} + Library + Properties + Simple.Data.SqlCe40Test + Simple.Data.SqlCe40Test + v4.5 + 512 + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll + + + ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll + + + ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} + Simple.Data.Ado + + + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539} + Simple.Data.SqlCe40 + + + {7DAB2F13-0392-435E-A934-4567266714BF} + Simple.Data.TestHelper + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + + + Always + + + Always + + + + + False + Microsoft .NET Framework 4 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + SQL Server Compact 3.5 SP2 + true + + + False + Windows Installer 3.1 + true + + + + + + + + + ..\..\ + + \ No newline at end of file diff --git a/Simple.Data.SqlCe40Test/packages.config b/Simple.Data.SqlCe40Test/packages.config index c2688fbd..0288ae3c 100644 --- a/Simple.Data.SqlCe40Test/packages.config +++ b/Simple.Data.SqlCe40Test/packages.config @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/Simple.Data.SqlServer/Properties/Resources.Designer.cs b/Simple.Data.SqlServer/Properties/Resources.Designer.cs index c9ed52f6..beabffad 100644 --- a/Simple.Data.SqlServer/Properties/Resources.Designer.cs +++ b/Simple.Data.SqlServer/Properties/Resources.Designer.cs @@ -1,94 +1,94 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.1 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Simple.Data.SqlServer.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Simple.Data.SqlServer.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to select rc.CONSTRAINT_NAME, fkcu.TABLE_SCHEMA, fkcu.TABLE_NAME, fkcu.COLUMN_NAME, - ///pkcu.TABLE_SCHEMA AS UNIQUE_TABLE_SCHEMA, pkcu.TABLE_NAME AS UNIQUE_TABLE_NAME, pkcu.COLUMN_NAME AS UNIQUE_COLUMN_NAME, - ///fkcu.ORDINAL_POSITION - ///FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc - ///JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE fkcu ON rc.CONSTRAINT_NAME = fkcu.CONSTRAINT_NAME - ///JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE pkcu ON rc.UNIQUE_CONSTRAINT_NAME = pkcu.CONSTRAINT_NAME - ///WHERE fkcu.ORDINAL_POSITION = pkcu.ORDINAL_ [rest of string was truncated]";. - /// - internal static string ForeignKeysSql { - get { - return ResourceManager.GetString("ForeignKeysSql", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to select kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.CONSTRAINT_NAME, tc.CONSTRAINT_TYPE, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION - /// from INFORMATION_SCHEMA.TABLE_CONSTRAINTS as tc - /// join INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu - /// on kcu.CONSTRAINT_SCHEMA = tc.CONSTRAINT_SCHEMA - /// and kcu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME - /// and kcu.TABLE_SCHEMA = tc.TABLE_SCHEMA - /// and kcu.TABLE_NAME = tc.TABLE_NAME - /// where tc.CONSTRAINT_TYPE = 'PRIMARY KEY'. - /// - internal static string PrimaryKeySql { - get { - return ResourceManager.GetString("PrimaryKeySql", resourceCulture); - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.18331 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Simple.Data.SqlServer.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Simple.Data.SqlServer.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to select rc.CONSTRAINT_NAME, fkcu.TABLE_SCHEMA, fkcu.TABLE_NAME, fkcu.COLUMN_NAME, + ///pkcu.TABLE_SCHEMA AS UNIQUE_TABLE_SCHEMA, pkcu.TABLE_NAME AS UNIQUE_TABLE_NAME, pkcu.COLUMN_NAME AS UNIQUE_COLUMN_NAME, + ///fkcu.ORDINAL_POSITION + ///FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc + ///JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE fkcu ON rc.CONSTRAINT_NAME = fkcu.CONSTRAINT_NAME + ///JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE pkcu ON rc.UNIQUE_CONSTRAINT_NAME = pkcu.CONSTRAINT_NAME + ///WHERE fkcu.ORDINAL_POSITION = pkcu.ORDINAL_ [rest of string was truncated]";. + /// + internal static string ForeignKeysSql { + get { + return ResourceManager.GetString("ForeignKeysSql", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to select kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.CONSTRAINT_NAME, tc.CONSTRAINT_TYPE, kcu.COLUMN_NAME, kcu.ORDINAL_POSITION + /// from INFORMATION_SCHEMA.TABLE_CONSTRAINTS as tc + /// join INFORMATION_SCHEMA.KEY_COLUMN_USAGE as kcu + /// on kcu.CONSTRAINT_SCHEMA = tc.CONSTRAINT_SCHEMA + /// and kcu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME + /// and kcu.TABLE_SCHEMA = tc.TABLE_SCHEMA + /// and kcu.TABLE_NAME = tc.TABLE_NAME + /// where tc.CONSTRAINT_TYPE = 'PRIMARY KEY'. + /// + internal static string PrimaryKeySql { + get { + return ResourceManager.GetString("PrimaryKeySql", resourceCulture); + } + } + } +} diff --git a/Simple.Data.SqlServer/Simple.Data.SqlServer.csproj b/Simple.Data.SqlServer/Simple.Data.SqlServer.csproj index 87873058..f6c82fbb 100644 --- a/Simple.Data.SqlServer/Simple.Data.SqlServer.csproj +++ b/Simple.Data.SqlServer/Simple.Data.SqlServer.csproj @@ -1,106 +1,111 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1} - Library - Properties - Simple.Data.SqlServer - Simple.Data.SqlServer - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE;MONO - prompt - 4 - - - - - - - - - - - - - - CommonAssemblyInfo.cs - - - - - True - True - Resources.resx - - - - - - - - - - - - - - - - - - - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} - Simple.Data.Ado - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - - - ResXFileCodeGenerator - Resources.Designer.cs - - - - - - - - - - + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1} + Library + Properties + Simple.Data.SqlServer + Simple.Data.SqlServer + 512 + v4.5 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE;MONO + prompt + 4 + false + + + + + + + + + + + + + + CommonAssemblyInfo.cs + + + + + True + True + Resources.resx + + + + + + + + + + + + + + + + + + + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} + Simple.Data.Ado + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + + + \ No newline at end of file diff --git a/Simple.Data.SqlTest/Properties/Resources.Designer.cs b/Simple.Data.SqlTest/Properties/Resources.Designer.cs index 87f6980b..660baefb 100644 --- a/Simple.Data.SqlTest/Properties/Resources.Designer.cs +++ b/Simple.Data.SqlTest/Properties/Resources.Designer.cs @@ -1,72 +1,78 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.1 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Simple.Data.SqlTest.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Simple.Data.SqlTest.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to . - /// - internal static string DatabaseReset { - get { - return ResourceManager.GetString("DatabaseReset", resourceCulture); - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.18331 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Simple.Data.SqlTest.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Simple.Data.SqlTest.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TestReset]') AND type in (N'P', N'PC')) + ///DROP PROCEDURE [dbo].[TestReset] + ///IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SchemaProc]') AND type in (N'P', N'PC')) + ///DROP PROCEDURE [dbo].[SchemaProc] + ///IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[test].[SchemaProc]') AND type in (N'P', N'PC')) + ///DROP PROCEDURE [test].[SchemaProc] + ///IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT [rest of string was truncated]";. + /// + internal static string DatabaseReset { + get { + return ResourceManager.GetString("DatabaseReset", resourceCulture); + } + } + } +} diff --git a/Simple.Data.SqlTest/Properties/Settings.Designer.cs b/Simple.Data.SqlTest/Properties/Settings.Designer.cs index 88874b87..80f677db 100644 --- a/Simple.Data.SqlTest/Properties/Settings.Designer.cs +++ b/Simple.Data.SqlTest/Properties/Settings.Designer.cs @@ -1,36 +1,37 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.1 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Simple.Data.SqlTest.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - - [global::System.Configuration.ApplicationScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.ConnectionString)] - [global::System.Configuration.DefaultSettingValueAttribute("Data Source=.\\SQLSERVER2008;Initial Catalog=SimpleTest;Integrated Security=True")] - public string ConnectionString { - get { - return ((string)(this["ConnectionString"])); - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.18331 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Simple.Data.SqlTest.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.ConnectionString)] + [global::System.Configuration.DefaultSettingValueAttribute("Data Source=(LocalDB)\\v11.0;AttachDbFilename=|DataDirectory|\\SimpleTest.mdf;Integ" + + "rated Security=True")] + public string ConnectionString { + get { + return ((string)(this["ConnectionString"])); + } + } + } +} diff --git a/Simple.Data.SqlTest/Properties/Settings.settings b/Simple.Data.SqlTest/Properties/Settings.settings index b3e4d7ce..1fa12bf6 100644 --- a/Simple.Data.SqlTest/Properties/Settings.settings +++ b/Simple.Data.SqlTest/Properties/Settings.settings @@ -1,14 +1,14 @@ - - - - - - <?xml version="1.0" encoding="utf-16"?> -<SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> - <ConnectionString>Data Source=.\SQLSERVER2008;Initial Catalog=SimpleTest;Integrated Security=True</ConnectionString> - <ProviderName>System.Data.SqlClient</ProviderName> -</SerializableConnectionString> - Data Source=.\SQLSERVER2008;Initial Catalog=SimpleTest;Integrated Security=True - - + + + + + + <?xml version="1.0" encoding="utf-16"?> +<SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + <ConnectionString>Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\SimpleTest.mdf;Integrated Security=True</ConnectionString> + <ProviderName>System.Data.SqlClient</ProviderName> +</SerializableConnectionString> + Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\SimpleTest.mdf;Integrated Security=True + + \ No newline at end of file diff --git a/Simple.Data.SqlTest/SetupFixture.cs b/Simple.Data.SqlTest/SetupFixture.cs index 3c71b48d..8b9188e4 100644 --- a/Simple.Data.SqlTest/SetupFixture.cs +++ b/Simple.Data.SqlTest/SetupFixture.cs @@ -1,36 +1,38 @@ -using System; -using System.Collections.Generic; -using System.Data.SqlClient; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using NUnit.Framework; - -namespace Simple.Data.SqlTest -{ - using System.Diagnostics; - - [SetUpFixture] - public class SetupFixture - { - [SetUp] - public void CreateStoredProcedures() - { - var provider = new SqlServer.SqlConnectionProvider(); - Trace.Write("Loaded provider " + provider.GetType().Name); - - using (var cn = new SqlConnection(DatabaseHelper.ConnectionString)) - { - cn.Open(); - using (var cmd = cn.CreateCommand()) - { - foreach (var sql in Regex.Split(Properties.Resources.DatabaseReset, @"^\s*GO\s*$", RegexOptions.Multiline)) - { - cmd.CommandText = sql; - cmd.ExecuteNonQuery(); - } - } - } - } - } -} +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using NUnit.Framework; + +namespace Simple.Data.SqlTest +{ + using System.Diagnostics; + + [SetUpFixture] + public class SetupFixture + { + [SetUp] + public void CreateStoredProcedures() + { + AppDomain.CurrentDomain.SetData("DataDirectory", TestContext.CurrentContext.TestDirectory); + var provider = new SqlServer.SqlConnectionProvider(); + Trace.Write("Loaded provider " + provider.GetType().Name); + + using (var cn = new SqlConnection(DatabaseHelper.ConnectionString)) + { + cn.Open(); + using (var cmd = cn.CreateCommand()) + { + foreach (var sql in Regex.Split(Properties.Resources.DatabaseReset, @"^\s*GO\s*$", RegexOptions.Multiline)) + { + cmd.CommandText = sql; + cmd.ExecuteNonQuery(); + } + } + } + } + } + +} diff --git a/Simple.Data.SqlTest/Simple.Data.SqlTest.csproj b/Simple.Data.SqlTest/Simple.Data.SqlTest.csproj index d7c35ebf..8b042d1b 100644 --- a/Simple.Data.SqlTest/Simple.Data.SqlTest.csproj +++ b/Simple.Data.SqlTest/Simple.Data.SqlTest.csproj @@ -1,157 +1,208 @@ - - - - Debug - AnyCPU - - - 2.0 - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01} - Library - Properties - Simple.Data.SqlTest - Simple.Data.SqlTest - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE;MONO - prompt - 4 - - - - - False - ..\Assemblies\Microsoft.SqlServer.Types.dll - True - - - - 3.5 - - - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll - - - ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll - - - - - False - - - - - - - - - - - - - - - - - - - - True - True - Resources.resx - - - True - True - Settings.settings - - - - - - - - - - - - - - - - - - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} - Simple.Data.Ado - - - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1} - Simple.Data.SqlServer - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - {7DAB2F13-0392-435E-A934-4567266714BF} - Simple.Data.TestHelper - - - - - Designer - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - - - ResXFileCodeGenerator - Resources.Designer.cs - - - - - - - - - - + + + + Debug + AnyCPU + + + 2.0 + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01} + Library + Properties + Simple.Data.SqlTest + Simple.Data.SqlTest + 512 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + v4.5 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE;MONO + prompt + 4 + false + + + + + False + ..\Assemblies\Microsoft.SqlServer.Types.dll + True + + + + 3.5 + + + + + ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll + + + ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll + + + ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll + + + + + False + + + + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + True + True + Settings.settings + + + + + + + + + + + + + + + + + + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} + Simple.Data.Ado + + + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1} + Simple.Data.SqlServer + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + {7DAB2F13-0392-435E-A934-4567266714BF} + Simple.Data.TestHelper + + + + + Designer + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + + + + Always + + + Always + SimpleTest.mdf + + + + + False + Microsoft .NET Framework 4 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + Windows Installer 4.5 + true + + + + \ No newline at end of file diff --git a/Simple.Data.SqlTest/SimpleTest.mdf b/Simple.Data.SqlTest/SimpleTest.mdf new file mode 100644 index 0000000000000000000000000000000000000000..1a7cf76209ce519cde55959230ebb80ce936fbd1 GIT binary patch literal 3211264 zcmeEP2Y^+@)t>vd7uaR#OIwNsX^T=t+(#Fw0xBp<7eSg73#dG?p(fF&QDXypi5g>z zT`aLhjY%x1iCwYxLahJ!=A83xdH1m^Xf}T`1NWY}-<)%1=9_ZomUq`HGsYxn3kA>2 zqT{)(&dCMr1=51?$FJ=%JCGC`tu}=g@2RQX&1(90tU1n{WKK1wnKR9W=1TJi`ge=D z-P~>NGk-Rl%qQj>ljk+{+Ic;^UA%$xZ!d2~=-;6p{;l#(@Gka#=iTW&=e_Lp&D~@3 zZTB31^XntdJnhSAPmOrxU5^UCmdgACg_IUyixS!hu*f8a(|)@B$paQ%_UPBoj#=Mg zUi&!@eS1RK^F%YxEHq2Z0yD=`CG%Rn?AUQ^@%2nM@(-RaM2gT77HB$8PT!a11yG z90QI4$ADwNG2j?*3^)cH1C9a5fMdWh;23ZWI0hU8jseGjW56-s7;p?Y1{?$beGJg^ zfBZZ@{rrDFsba$5_y76k%XUb@BmXmKcPVYh;y}XiQEz{t@$B-z>`6aCO22m2$=dJn zdwmxi1C9a5fMdWh;23ZWI0hU8jseGjW56-s7;p?Y1{?#90mp!2z%k$$a11yG90QI4 z$ADwNG4Mad06%!Y2fzO>qWBh`|L0J0@cDl#@ce(~z;n`;>@jZtZ+QM+zQ^o9vEmBh zFvoynz%k$$a11yG90QI4$ADwNG2j?*3^)cH1C9a5fMdWh;23ZWI0hU8jseGjW56-s z7;p^y*D`?T|1LNN90QI4$ADwNG2j?*3^)cH1C9a5fMdWh;23ZWI0hU8jseGjW56-s z7;p?Y1{?#90mp!2z%k$$a11yG90QI4$ADwNG2j?*3^)cH1C9a5fMdWh;23ZWI0hU8 zjseGjW56-s7;p?Y1{?#90mp!2z%fw&40z>KhV)nb_mcu8%q)uKn=jktlf<|6C(`yj zZCBBz;h>T$_SSfI`E!5&pZ{<}eSQDGFnh)S4JpZgLmpemBHeGcp!4%3q370LNY!7~ z$T_!Ov#+Yx-0g%^eZ|H4XPdD*%hwzK?krz#)Vs5My;1MZ^7Tf& zJImJ_^;Pwjv(4C@i@&f^7#J0*C@zN=JWpoN)8U*U_5A zQJ?H5*L++pP_y-UC*tK4f;_XYIoK?xe@o1+rU(5y-2UrM`&~?Tv)C*(a|zwqRMWqn z6q{_un9=lAf>~rY$1F562w%_Q2EkfJKhpELOuyq#h5?kP$W z%{=n7#4I4isKMst`;E<0gN|ky6?G}8FQQ_p&(ps-_d9$p!TQ|J%%oB;w!TmVRr>Vf z^B3Zs3aixK97GC>Df{JVg(0`x_B}|q3LVXCN?t*}P$ufDB!+=VEcLat{}dB)hXET=ZqVt>A*|Ee-oZ68oog5(L?t(6U@kT;a@pyW6Nf$ z(%$T4#*$i)@%dBADx0gq4wO8O+H4SQBPljE?Ppoem<}yetuJMSk;ENko>@s{oK0gW zvn#*z>DOags#$wdSZodUOBaTVDe9mu~!QWRA=c-dDn?#~49Hm!>^^+Pmu04yrW3 zGQG%*C*qb-hry^jjMPWQnijv)@T`t%+M871n}=$4qq$$5-+;K$?u}_AI2kQJywYr^ z$!%<(_2-yn|7taGdrfRlB|O;n3twT*$^%PxP=$8Xp^vmRRzgncJ>$|HHCgLAwob+V z_^bWacUIFL)L|A`g67&<&!#CoT#Xf94C=9ys&~s!XFj!9m*05)Kf9=M&kW^>8P)uB z<+_WzszGL921lyB^qp~k>ZaL<@`$k`H>Zxk0sm{UE>axHIa~Yjj7gEodMZFj`Sxjf6<%G?m z*g`tRE;EPHz{W(j)OOyb=@W3Tbn0@V2B_vmsA%oZn*Fp$_VH(RK9~2P^Ll^! z*N>bplG$zrKpd&sFfv_1n0ASg2X!6TOVxWym4;G> z*7JMR;Jk^~&g`uQgT!EnWdwOFrJ{_Z-1IcMj9Mt1<8i0|a#o)o<6ty30hSY5Zidp;j8h^Xy) z*?^CRsoHk7lvpS5*+=<-*HwDdc04^74j zk(YkTn`Y5_x1QlDw& zlZRR4P1WWeer|(ts@5*O#L?u}4sEgfcumGRRHqPAIeKo!;LE4nOf*rKv}k}7w$O?3pFRKe3+s++&g z{`$pa8+^RYdc^{6F?mMsz#?UKnuNp7Ip*ShRIR_1a!b>pmU^GFPnx!`8V(E?E}%Sk zZG&#Hk8L(Ak#MBOE6={?my^|4xtT~ROQ{aQ;>|qlh~1{BA{s&Kpq@T{W!;B(sohqy zGqn*00WOxJSysRJ>Bal2;=uHI#lO5nrBQb7B;oR2{g=5Tr>e1@IJJoekdUtZ5=kczlisoqyCZ%W~m8W}PgT^cxf(ytB7nO6&Kx(@=6vu@G`Vcgh&@nDs zF@xgT0V_zoiWo>Id7S8bnch^XS+w;d|JY{Hzy7okU=LWA;N-uI{-N>pOojzDw}a-t z(3aMp+m`M=_pIqkL(xw}Lr*H$|2HCrzw^z;8A?PqngDpBR3>pg@kjggmUsPfrYiSL zPg%H*#WDvAL(I9p!QGwne>qDHhEW@=pmygQC^$7@a^{ox5Lu*PF^9H8@1pxo&zg77 zCu!(fbMp^Bcy#@>j5^9PN?uHNez<3&gQ1rj>K;28Tun}_YM+~Ha0kS^ft`j2GyDw~ zfAEGb%GtsXu5Q^6ZjyxkJet)H7RWdO&rX*ID{c0JyF+0=?`HLLgq?{N(;oG5!7<<% za11yG90QI4$ADwNG2j^ZPiLSdn1bqi^ey6zxcC~&EBC6s=S7|t@EZ7 zJW%{q?!dC14X*W`EBqku)`lx`&nc}eT~PXPgLCrVEB&bGv7+-DT%A}@_M5Wja{lUl z+~9_s({kD+niW4?@`t>N27gQJo;anbVg7^$R~7D)dqCpJ(x>wNSaNRe$=(p}(t;*A zgYwQOS&;Kw!`{VL7wuF0bnasXpCm?=KA7LJWMiX4N;(yMWV+>>vM=(RH#|81k+Rjr zmlW?&@|ZcQ;HKQalpmG%%Z7OseJVy4E;Ak;+u|vFD0p<4X3RY;lli#H@@PAgc2j9X zT*EHQ79FJV?DCbo`xEzP1>4n3rDuWTC^n2@6X~AM z7v3gtDb}QyW2_(UWG7k9`o!sQ-3jf zwG{aIpvJTN<&=JS{_28bz%k$$a11yG90QI4$ADwNG2j?*3^)cH1C9a5fMdWh;23ZW zI0hU8jseGjW56-s7;p?Y2L6W`u;2er(C@F)-~ZR&fX}wi`Tx;$Y7u@Ajc4)r4fk}~ z^bG-unoZ5lz{g>?81i9kw;YP#)0FgD0c~j*KmWEca`It(P0hmi7`zX|*24Heq7UPX z`W9{!f(sSKFI#cHx9vg)xp9|LNLl@VSKXPcY+rpER4^z`!GJIU|~?{!+34N z!uS}w52JDx#^>mK7?rbdWe7&)ER2uf`P!(Qh4CqMA4cUYj6dDr!%Y;%r_+5Hm9yG- zpTdVxISW^XU{ub+?L#msXW`i)7?rc|oDhu4Sr{LY@UukaEIc;^qjDBLI0U0|7M>S^ zQ8^3G55cIMg%1hARSM(F3w}vZIjg-e1b0w)Q3&p+@Zu2MN#P|Scsqp;4Z+(hyfg&k zTkN(Z_*|f0z#SD{9)de7ydnher0`)OxQoJvhhV$_WV1XX1b0*T$PnCJ;YUJn4}~8M z!PN>srZ6T4Zx@9NXm+r*#3v)XUJ7>&!Mzpk7J~aI+&u*MRk%k8?x%2d2=1?N&k($; z!aIjxOoEoGT|zLvjBVjwAsFAows7wdyt~4ELU4`3eM4|k;eH`_kiz{#aC*YqH3Sb< z?ExWph{C&t;B=227=nkY_U<8gn8Gz7c(}sJ5S*UB2Zi7fsy#Ra@1Zch%;EQwkqQqB z!Fwt^JOqzYcti*ut?(Wpc#Og$L-1II4_4TACg_VUlh3^+UQ*ckg zl?A64^eSjmkYDgo{>J?K@~_E1Gk;G0*!;fvMfsoRJ(zc0-r0Gp^A672D{t4lj(Med zU*x`&`*7|JxxdY=%D=PlZ-p=B9hHAs;V%mh$(@utFn9ahvfRx%ujV|Kb5qU*IVa>S z%Goz3nbSF^BIldL8;K_pw3?3Wml=$dGn_}<&(J>}i*UE-bUE%y%ahI>7{ z7M|z5YyNKTGMAfQ(ceUyZh!xe#|<2C?;asx3TdBfHn+n)^x&=RU>usY2i#Y$TkuR3 zDgM|T+!p}q#;((H3^)cH1C9a5fMdWh;23ZWI0hU8jseGjW56-s7;p?Y1{?#90mp!2 zz%k$$a11yG90QJl|5gSz$n$^y_y7L$e>{c9_y6&GcEs@>0DhK^UzKZk=(M-+*_ zk9q#juJH5Vy1oVAp8nTDze{!uI0hU8jseGjW56-s7;p?Y1{?#90mp!2z%k$$a11yG z90QI4$ADwNG2j?*3^)cH1CD|JdIs$G|2_Huf5J2PShZ*Hb#H_r2Hy~0T-?1iK3tDy z@n_O*0m(|*mg76Y6s~RBp##UV@2kn@da|*&K5OxtL}SGE2$X zT(gjnMTGe7@PDGs~!SE6Jtr4uq{?F3ZUD^2=%W!w>8PtR?X+`*dKJ`&$Q#$b6|ek}8eLE~9^__#8T(NlebB6qNR{ zk8YwbyQ6T`)wJX0U;v;W*!3WCvz#0)H!CRSJ3vwD;M}mcb(ktzXkUPQ)Y|E?E=c$FFF45MTjGmJcA<| zKC?2KeHl4o))rAJI>I6<{X*&vV9n10UtzCP=|^T{5vBpfs?(5~nBfQ=V~H(e*d;z; zUniF%se7VYhf&jTWy6jzWz@;h{uz$AM=U4jGsrb&m9XodV20yS`IF6X?CvL<;n>|z zI>WKcpJj&It=|PJw`qoB2irKqv6Fwt497YBY%?6Y|5;`@cKx%?aGb?YFvGEr=-c#of404n|l$7g8m09WjkIz93;YV69GW zhR~HEt{aw-3th*ti;Rb|VbcAj@5PvwT&@@Ns z>~&k*;-C9kkehkw&cJ0tx2@A48b<8Qq=CfO&B_p8%j1eER34Nmt~>|W+=JJkxct^j zICNL^G3~Cr82p)>^E~`BIp=|fGjFK9v(Yk;+Sk8vu<5cRj{Xt-e;9E#gPI1{hkn;( zC+PikYTfXB8$B1WvpP@SwVeytU7e@zaM_~g0(MsCiF|~eCFW2c^Jm`O=ybQd&l>uJ zci_v;ypK?%@F~*^bw=C|Jo64TV`X0TjiFm7<6&kz8DkV2PGuUne#LO-VPTO#4HvH>#dg^H7ngdw!T)Ej-;o7n~E z2%U_;b==8lM8L&Rs@HO=7n+sbWDo;4am0+I+vB(ix}3%`&Rjksl=+4g5OHq0280OH2wC^M9rW*My> zaW8xc)r{BKs2#fk$9LaNJMG6Pl*TDafrt1Ivybh9SWnyghbK;SlA6O%v za`eIHX8(>JFQv1>DA@9uY7#X(9@Y8Ape8g;#5O#2;32fU8cV$&BO9|Q>H}kJ*5AnM z&XhaBA%9!u9tB}T_zM}rZ(PTzp>d6?{Dm@8-TB2Txv&kH*PbsMBHuba_Zvw0;&e8{ z*0$U3v#FX6vsL0u<*99UB(i^(_R;^HdLzF($N70kw`e=C4 z;atTSRknJy^7@Jy6%`eK zYLsepZsp#UEh;yaT~Ic$thnsqhN*@_8r3v>p~0#K)eYV(y`*&S()`lfOWrC!u%x8q zuHuEoor)hVN)>f0dZX~z!tDzmE;yi|MZt6VCzl_U-#Pz1&+|rjo6Xf`y8Zq?^%Yc(g8%#fR&<2l|Kq+T5^;Nn#=L1RniMrR zpO(O#(ptig`ThTP40}i*UMR63M<|IvWNJZ< zFj%M{M;OGPA@EQzjxg9i4JDXTL(aN3=49E&CxL|$Pot7Lo8?~t3VI2U`fCydWZ!Z z20(NM3pNgbXkrUu5>S?=E7&^#qBX6iom3@vv{w$sCP%oOXfF$Lgh4ci1<^*D5n925 z9AV8N3Sy>JO;BewF;yyv!l%s@oUR}mPC=9;7vNI1?f^A+#BJd@!kS&woFhJH%>k-;g=%tyH4(R(9AOY^5?fA= zFxX5%jxab$L5?suML~}Epv?%N76~K8X2cQJ#B5_hjs!vKU=t}-yNzdyLValx=5);S zmB!4l3tR$+w)MeT3Jwo|a}?Yo0M1o#&j5I^f};Z9JOxJwz+WhMcmVvBf=33x(-mA5 z0MAhH=m2<@f~y1I*$S@70Ewkz1K_!;d3*poPr(xd;Q0!k6aX(&@ZrMm4d&?0I3h0odHsj&Iy25tNFPZAesL*10?hF z0^l`jetrf><`-muWPV`){GFO#6acSPa9serPQmp7@OlL=4uHQ`@R9&{gMya^z&|K> zSpd9I!OH{SO$uHS0B=_C$^dwaf>#B=TNS)I10+JO34ni8&EI8!5zX6F^V)#s?FwEO z0Pj%n`T%&Rg1--dcPV&70K8klKLo&g6udD2-mBnE86Xw@<^Z@sHE+oPBbxWA=B)wE z`xX3S0DM5f+XCQ&3f>+7|D@m@0q`LO?+kzsD|lA`d_=*!1K^_y-je~+K)5#pq-t&m zfRCy9eHkE`-=6`J`2zv)&uac)21w?A$^gmyp#b=}nm-%>pHT3T0QjVWj|RZMDEL?a zd`iJT2f)87_;>*Pn}SaSz`rZ_WB`0x!M_B+XB2!Y06weWUjyKC3jQqsZdCB^86dIr zbO3x_HJ`}j}-h=L0bKNtl(z~(hBes1wU7iG(T1F3k6B@GX=j?kTgG6@GAvL^9uzxD@dAO zD)_Ge_?3cR2f)n=exo4y{Fj2?2EeZs{4M}~qu}=e@LL6c2!P)yXm1zFlK6WCy>|YR z_y+|O0noIB0xh0%0-&d0ZU9Uum=^$Z6wJ>6sfh~$V6JKwW`GgRJk=};Xyz+e8~_Ux zED3;x3YG@IA_W@+z+wd(2EY;p%K~7jg5?4e-XQ}d^NstM+Hf< zt%98uB+YgT?xY}TRw>v;LDFomU{?i6vx9=&6eP`#3U*hJG&?ESBLgHtsud*j?Nqa8 z1{l;NpWCbE&H>FG6x>BY(%ezOUJ6o1ofYgI0C!TbkAh_0MZvxbl6hAJ?eAP=TI;4@ zf7K*&2C4A7DoEztRdYZF7}O;59;&%pK(kuGfeMmlPX%{ZkTTj?!5Rfga~B1Z3X*0o z1qUfen!ObqtRQLjQE*5A?5p6=43GxGundr@IXnRNQ}YoSAerxx0h0O10N7v6_sjsv zd{hQV=A#4Pu4+C;K^jI~+`l?7FuzT*&EBNvwQ1Jo{nq!ley;U(t7v!Imzcl}V{EDJI@^{H^n_rZFaq;JQ zZxp?px2WKu{KxWc$y-mqsy{4mM&5xX-xZF|>zmghuR-4C+}CrT%xzeFPvPykm*t+8 zyE1o9?w^Z)Q9M3(K<;0Pw$J^dcuGN|+&|=ho71CUQ_kOV?#{U?=ggdAa^~es%Bjg2 zS+ZNv4n=PlUR~I$gtxQT#=E1a(EH51WF9r` zN{UPVUU;*4rFdw;g(YiC_9|LuPN7d#Os6#uJ^7<<%3%l7hSoryIm$ktUvJ)Mi>DL> z+3){Pr3mhf?m&GV;lnW(uj5$ueYt&5F@+T9)+P&fn7<}$RBCRao0(;#USbpIzHBPT zx29XDutrHyoZ%_j1wyW=pn5dPEy}c(d#x`p#fs<) zRd_nzm9~gA_Zm+-k7aF5y3jU~Zz?I*GJ0TE61B!HdFm}J;`7co?Z|1FX_3hq9-Wdk z3$gaAZ1c{u&qAA%b@OQ6^5lp`FmK;QuIWMtWu|pz-u&FaV-d8r*#`2CEjgX@P;wUW z*6mGG>gQB9s$Ycj=4{PEtZkveK8Hfn)3UZxCg=8|$apM*)_%R)nNrHT%xuoIw&ykD zv0!WN=bAI@@C2ibJ}H#Z-u5Ae@mK_{?UP08qS&mldAG^5#uF`KjfIqajh`=KCFWdP zZ_F(b*6^&FtXTx}J|*pke$qB53^=9d@SF47GVzXXf3Rtyu)E3)6E; zxjBxk8_@@KGDavKhEd5`uyu5VZhmigt)-2eX*K34J$TKZ-&|Atg+j}Uf zkTr{V>!#-SG+|fKr?RS|dE?a~vStyq_B3mH!?m5A*JAR<>qKPDB50j9rq`puS98ia zgY!Munnk>I9<5Mey-TL`NVaAXZ{5l~NSU`VH`5kru|3(E1zU4_KS2o`^6C7ExdkhP zi1jFfsNO7s)(hE`_H5lE&U!3cvxqNwp6NtN<)%Gtk-W#VH4CwhoDB-iuW0!`oyw1O zc<9<-0$a1lW{p{|%=DrSp~Anakyl7q#9QZ?F4T3(sQe{S>%9pe)>y<_=bE!f=}bC< zX5_sOTeFC_&NrQD@n1%LEyH?Wwq_A;on!WG2kY`o>;2f8g;?7;btWZn$hFpu$-1!x z0<7&%0M(mC(0aDm;ygCb=G{J%wW(~)B4~}7kV9Vfk{>`ClsAi@HJ1|h1!k7b8`lO1 zfs!9chh)tnXl)hkF5j#q>uQ?MOYL#MdKz1^h_@~>`|JqLv2H;KSWl-z%9};Jb+LJ% z2G%jG&0uR5L2H^uCC~_^o?1@V&*c^g^Hw9-t_JDBt(!;BUqN3doQ%-grl zr85xLEsZjJYAd#8!PZns3ba&7hazIF#NHnO6eu~SOUj!?eBKFDD%Ke@QwO$Y5zO1a zE}?Ru#k^uHGchuKtPAyBs+>OO)pR8E~ z^PZWu#vN6hi5g_GhSNS-vj|$x4p^h-w4{EDwPvWjapERx7C~$O{LOhcro0&oaE?d&_jvAZr#s+Ij|Cvj|#K_ezJXqXg7a-YnR9cnW6z893iGN#G1zl6eNk zP@=c5SxDa28Xh=oVSMBCN7gLZn&-8KYD`5#z2?eK0z)l^(;r#0h|fF6URkuF)ke$qf~|RWsMA>xCosyJ1zR&~$b|!!d=`~F<7|MF2wAg`lB-!-o<`00YnmN0taoN> z7QvEtOxsdVrHLl?Trz~MSxCtPc8Kx_t%w_;n9!)?EP^Gc?9w4?KgYB{)-1$2l{T}H zTvJ7|9bLV*v&WG!M%EZ(L=7z)aqSlkSeJB(<9s?LkTr|=dgq$$taWkbIu+f7erm*m ztqGwJ>@CG~T+Tn&p;(~gXlSx#@uN#_E9rUoD^jR4w&-1|Vly>?-wKV+oSAI*VQW&c z)`L?N350yQ0;N|2=y#+z%ZEx%_an&0!(RtW=Y0w=KjhOr1N_FII`iyrmojXvc@JOf zTOyWY&mk4GO3zqfgHFmDe^e}6-sR?I>L$JDE>%w`2RSdnFUbfzfyc?o0o`*k4wiS6>8rga)^0pUfo`*l9mCk#OB`3Y3 z`wkTEZg#XX#5vlVuI5-EN+UF4oo{ZW+m5YiMs97>!8uLgxCLuZs-Cz1k*8uYYEy@! z3U;(ZVh~+UNo8~e9JqJS*7kJec~9K8j9jvH!dl~qL#|l|$L0dsBVzNmNwGbFHSnVU z`)#gov!u<=Z9Z>(YwIIg@7ns?R`;|@wHn+ix79@Uav~1Gy*%s%v z*sn$F7B4kl-+X5CPR-wHc2%?a%`P%sn|;{yhNerK_G0U_E-N^wV8?=Y^RLZclwY0yY2MBBjzYh@uXFFpJtj9vU;lqF=fs>na*A^vPy8w| zKCx5Vip102+1_NY(z90+X%?|8LrBh7+;rOPcqfVQ)!AcgL-0|yJ#Ki^ zE!dVLRrFAe*JkOy|6dzJF5NNU7;p?Y1{?#90mp!2z%k$$a11yG90QI4$ADwNG2j?* z3^)cH1C9a5fMdWh;23ZWI0pWk8MvY4aV_ol|M8$b{Q^fH`?+3^Uj4x9R~wt`Sc*3` zpmHYd+K{ZKO~W3&k6EYjY_i<`=m_4}4}1+j%^sT7EUf<&#qptMq}!J;%Y&A9%LAKQ z;$>qEDT?4-9)1&q-pdJDB4=z-OK7KPE2lRaxO7oVyef!oe5AAlSxdZ)g7nPN<`IT% zq*z8vi`N;Eo@t5qz_4YrtdjIhOS}VyO)c@dmxdHYI?=|j8Aj`g_rI`Zv)o?NGxNl| zAlUZIQqLVFJ<}5JePPo)qYU8%e*111UIh-dC*JwOmdz6V)4ms$VTnG1O)aAg;TY+e zrKK{!TiWt+`wA5_IsEVgrw1*$ebJk-?S}W~DAc9Lv!(X}tVDY} zmsWecT1M;HnJl9{o-MVdG?U>Oos4gBeraoc!?9~nU-aQ zVasNTA%yfyOAJSBY8f1#DZ(*6dB{dv1w9&D+LD`{5bg=zlO@uFd2*l9k^K(6>WH9y z2zZLNxN{j>>c~DQNoo}8GP2oHN48pOp74^Q4J{TO*=(6hDcH2M(Vl?uiS*2RqCa5k zmZTkpXivcSO!pa?sX0#_*;A9SGv+!T#x|a!Jzm$3j%>EX9$Plc_L81iS{>QhEO#Kw z=*Z?gb!5*^k_v?=x7`Sfj%>Enk*#?~E%D-UbY!!oj_hoC4kXLy$mY^(@8j0S3(kH> zQ50l0_L}%P2!p%ee8$ zmdcPVD(!;xOwn=N_+(3zhPk2$g_$hUd(3^D9%V?!r>b7A5tD3(DCRzYeA4Im2;0f( zpjEkL?V;He=m|i+BTG*A^JGhunadq-`7K#;dejoV3!8?^rGM-3H)P4_z9r6Y{#A!+ zM!Aja32Yhd3Bh`%$Q`(i_5`+!_JpVxmYL_5`+! z_5{p38d4O&8o}=gd|k$tn8$c7qX>myX>pA9Eu(!XnkU*b+J`W!ZQb}}%dO#-Eu-8&6XGo*fa#^ z_!NPdhd4cINyqk@ByAa4_u(uEo#45Q^VF+IwY-iirH6JM61|FKOTCIz)u<)byV0vi zw#3NArlFHYMD9+K)1&p&t4KA7ayyn1qF0feC+1F`KiM`~+6n3OXr8z)i%mn+aw;Wo zdejp03^ol>%Y!I^)1#J{$9OJd+o)yl)&jx%SuYYrXjkLx{4AwJ!*-oVg3O-+eS-!LpnWb zi5Uu;hN$Hol)&jxOUzK%G(;^Qqy$cnT4IL6rXkAEla#>eQOkCef=xp-&zC5H)1#JE zl!8seYK@Rg(e^fNRkUT!ChZBsrXgC|k12uE{X8dGWsmmQH1yL5$rNq5v~haWGJ58X z_5_?6pc5=D=ULmC7jsZ_ZNio)4K@vNGc~72OB+4&c2XB4Q?y||h^|feSZA=KNCP3r z5RQA(#xtCs=M*GZ-hM2%Y#HS?m}iPS$8pP+QEo4nHb8k`8MmfpOYnwGL(mc!&Sjh) zt!I?mV84YW&Ye+iInU^-CTfXRiLPqcGPp4++ouYu zZ0q_hTSohBaPCWyXYd-G6WB7^Z=sE&qGJwg2zK68&e)WsP}{!EgV}GfAcZQkn8g)Y7JsBaT3c4(c3yM_B#Y_a8U{51!dS zu%BwWhOd=$jU9B<)#_1+I6_C{=t8^S+3sO%&$Y8-(% z{-6i;Z`l3OcFzk3o!WFE5hNR53bKwkLPvD?3%ftd?tf|bI!LujdhC~IH>*cg;|Lv* zqmIlLJxTQId{qi8w+>bhvL|KiS5$B$T5Kdh9zIWc4VWBhXT1 zYf;P2ceJOqBwLQa&azNGP)8i0Bl3Ef-Ct_=hub~!L%{Th(4Ix0)i73Vi8z9EPo@;O_UxZ9smq|n z5VMXr!j8sR7re)fmby5?5VMXr!j7=7Tku;AL(Dqj2+TcmOkj^?NL@;lBt7ehBXmS& zQv&<_Y@FK@X&m&}FA@5ob;J> z?vOcj07ugT`{_1byQ2=IXB}~bj>ypwc7M6uA8GfscSv*}>xd(CM2@iN)%|!IuUm=m zqKECxJnwmCr8U0A?pN7;G3^m_siEgLztu1?{y=nxW=Pzi@(l00*|@*xp+gFK>^s5< z*0vf)prkI&u<_IFUJZ3QrpM%n?r{#IePgRfRpSU9p`LXPzN6;Wl59Bw51u(Eus_$v zw?MX(sD;%dM;xIea`fB4{yZD6-I4Y|xgKCgT+NHD3tmu^A%Q{z7IFvIo{pqMV9k=v z5$Jhlk=^4ajc0FsY;p99qnTEls>TsIBI6cxtoxQWUVGJGZ%f1xc2sGNdEcszj?hKz znU*8$2>ZGPzxiQrOT-bFQxWPM!j9~qg`;#6ZiS-(WMiww5qQ|T5=~G?9NBtDd#fXk zY`vqtWNOLg2s`R!y)Uv24}6PPN75nrii%7)!j4X|#=Jk-#%u48`&d14#1VFcecgiJ z{IIuG;|R>RuGL^~`w>UB-qF6c2vi7;Y`r61iIXE;l5cI*U~hXiN4CC1yTcUxa%9^a z*%HAKw-@i>vi9INe~ncpTaMsp>mAt=!O^yq2x|oEfg^HY!Mg1Hs=?lth$CC?sI|?P z>co+4b7V^dN87>??CqfC$hMWp4q7#%78j?L=G%im!02gu(up>WZN8Bj^KzV zRHnQxZ79$F%fY?~unA~@QX4vA&7^}rE1uwY$we)IEs zoQlGct#{Pl=1Yz^vTcqmM{u+)9POkf;>gyQ2==x_9N9KUc8I{ywhR&2+i8R&TVJ9s zFa^sT*)~U(BRJZYR)f9eh$CBHq6(OzC>+@~N49Ekv@KPGy{#HYw!TD7VTz(~WZN9s zs=?8=RIM4x01q6I0}Iw=S3*jBxej|D8AU2L7B zDOw_qY<-DfZ%f3HZF6KhBphwad^8Sa0683y0}Iw==eHW{ZPhrk^^S^czEmQPY?~un zA~@Q*=EvhmWBxZU*Lzvk_;S7WtL!FLn^@)u9TDa3a-C@KhX}6HZBOKg99Xa}yRakM zv+Ho(pDIcf^(}g@;fIBrnq6MFzG7P@!^VY=6&zczs`0}O`W1YXe?|TQ z`S&-!sM(`MP4f4x_;cQcE%qzzQ?k0`&B|V7QyL!AU}9zO21hm8&}vOy|GbZLugrb7 zd~*4Lx$l=g&~)d-a5IWA|{oKF%BnyhQmv*}fdBb)EtY+9mO;t8)|#qr(%@3P|k zi|=dMqh)!+isDHv8kJ6H{ZQGb=4vzDd{E5a|5pa^lmWs2{=c5#aMulgaAu%Q=iSiL z7J!yo!hyA<`^la;l@9O+ZLvSi?)}vGSig4hxI-NSjseGjW56-s7;p?Y1{?#90mp!2 zz%k$$a11yG90QI4$ADwNG2j?*3^)cH1C9a5fMdWh@V~-<{r-P3)z-eugj)O0|M7dM zeDh^HeV+_!<+Q!c@A6QL{%k;5E*{v|5`N6{|Fz^RkU=e;k?fxT*MTIb;uvrYI0hU8 zjseGjW56-s7;p?Y1{?#90mp!2z%k$$a11yG90QI4$ADwNG2j?*3^)cH1OL?w*ysQD z`~RNlN{`*~N&fAu^z4UdTUNZ)syQ)$C-NuKt}RJ?|69X3C3jq@@oci1eD1a&OY(gDRA*Wqg*^%AC0 zuGsMLIeedh-i8=t%$OlIYEnsKQuIYZ$odH_BiSA+UuKwB$_a;x+$>)cDdVr`ne9am z6gf%cAtKj^{H@3vL_RF?C6Ql?@1waBwYUMKQFkuQq;RAiBS zs<=vIUy)-)&JlT($TLM=Bl13x8%2I3GG9Kr*+yh9k)uS;6nUh`(?wn>@*a`ThG6 zMv;$-d`09}A{$CS-%jLiA}5NRFS6W@T8vQymejQvuBM^PFlMPVygq3RZ|K}czU{oXx`%X~qH0(QR5D%Bd!}w}Tj1#=v6$9g2FEKDq z0WmOUoEW%OJlrN8ZWj-?kB4`Q!gNf;4vmNL;#sJGtUWCro*jjm^Mm5ygX7`(@$iCp z7@rCc6_B%B5)UtphnL60hsDE3L}5B629Jz~Q&E@;xF!nIF*$i83bXcOQJA$o8fu}+ zGh7f4V|fyz-7N!7q9i?|FqdSPc(`{w+&3QX9}f?RhX=;PHSzGED9oG;&VX$#heu(q zaxop2c}_@v?#%oul)02VHiot-TGayG7WQ? z;pF<%@kfPVxJlJ)y6lLfW8gauyB~{QEF~&$;ENsToAvXO&G4mV3j4EI?=4&@CH+_= zCz#WZPudvC#VrQ>W5$w1vdOh!UsvIa#1v+*2>4ss8GB{e z*W@m&o$0HbZ8@1Ly_Anhp8Lqf=gnyPd5vDkWxD`8p}}hJioWasYunVF@fU#Y8%+3* zxBx`kU_<-;f4Bh5lZEdGBEJy1F+mle@R7)Txo~SEvX{tFB4>&`Qsn6(uM~NY$Y(^p zFA}pHLZ!%_BKHtEO(ez}!Y@T$Ch|^^e-rtRNFx_+%|&(>IZWhKk;_D$BJyI9w~73V z$hSm(C$foLz;zKhSmYFuOGKU|@*mt7v*+?$nb`)77avzZkMIJBme33Vb zd{pEsBEJ&ZP%hlI6Sc>#D@=#hv&z`?gB4JEOA83Aa{WmcyTDUU{55wyT;NUU`1cX%a|2q2 zd+dXU+&MB0CzA?)ciQjwOvC;R@oH6SY#Lsl)~+13d|Vp#wZDI6=)@TKwS$`O8-l@0 zs^+1u-rO$?Q(;my{gO{kje$cKGk$fhS$nI0jRP1}A~|#M?2r>KZDt;BY2(!L_%4;*M zQT2%vMeRkHK8>1Y0h9g0X}VlEk$h~)1+BhV>LveEFX;3l%$Vu5)#{Zal2(P}AJ^=4 z=249|r!V2y)NEM68YE{Y_kQ+w<)7DFe#zVRsh!oJ3)x;BSvPngd-KtszVqeXn`M-V zufPRkqYoF|(yjg1H5Z;2_EpiIb>%n7+1sQ1(4^HQ`S4CX-}`*kmw}R}2lwAdC*9f5 zi4jsYuhO32$L%5hc9J}<#4U1!d{c!#R=e8cL+tOEALD0z+e;UuVUuL-R870%o?8)y zk(A77a@COp!|9bp&zg77XMMANdh!H`3X@f9AN@^)x(P|E@`yCY%kq+v&=tbzG#53`{p=ZBDA(wMB>W84W#o{@;ph@%$gp_&vJD#-o;l z%1$qDVULaZ6*b?kv|;Ad@W4Y0x@tU|v;(RGrK%xa4&(X%q||D!>qxeu&M~^2qEFMu z1`cjVe|m=UL2r3#cVqUJ_!0D%O*RpRzr2w4>38oWd|r_7ed6kP*nNCUNuPD9q$CR3 z`T3|m_Nb$7Too$Q$ECx#EcIW$=sN}Y<9i6XC^Usqk#fg?)(%vQK>5+N(CnS$-41JX z(Z$L4huWB}JI5loIT@t=u}O}qG-mN11Ggy2*D0bQMIrSpzSfElm89AAy0EWv(djAF z>g)8?Nvo)m4zzEj`=);av3>K~NZ%Z><-SQhzkUNX9nOoE3%=c%N(S0CS-++8|J=Nm z<0y&Dmd0BkvPy8d(`?4d@f?x7-d#JG59z9vB2;gNuNtH6)eIU= zy^X;QNsAFUyebV=4Nil6rH#f&`I>w|4X{^Qb7Y*)k(1QthTjcUpX2?El4+mghp48x zEnUv>qtf7s>5L}EnNP%PZd{}BY4b^bk@TFNs+lw)tr-B* zv|r;<53(!7H3^#2Hh8qEI^Cnw{V30)+xf>Q=-&IWiBjyy`t$@X;#w6X&>-k}*`_`W zEecg_+g`uTQ(vvVbjnjn8F!0JeR|rj)t8>`Rg$lasgGK~2ATRs=B@U0xq~ICE``)i zrJpAw64kb$mNUk)7rk1Wyf6R!?tgrf7Eo#OBScK{gSL3vm;&*<^uXo8l7F< zFb(@ozS#cNMlta7fBZw!5X_YyWzK6J1An>TFg$|xIbr`<-Z>dPyhl|?n|*&Xxy1o7 zaK9%{@NZ!HwG7?#@v9>@ef*NJ?_(!Cc}$G&H&S24zAi%7JPl>q#JBkAZ?w# z`XWMY2u#CTI!wb_a?MpGx~`jsg}W^XHw_axshYFy+F)Xa?iGE$+BpV({dcp&&yhfI zs^+u4DqhZiG)My<}00lYtj5^`8v+GwAQ% z+^4`nqJx^Z@UvCx1f@#q*Ww2?!4;;A2Drx_+bZ4o!`q_d$mr()#8g}|NHv4 zskrmJn!U~mmunJM{1h^$;YhizIx%S#Ngmtf?B{oSZhfs2=}xqs)zc3qQho5H6R1k` zoBxD~6ntX)|FWLFCShB|oFVJj^F-djuz6VIOCrAzSt{$#jv{fZ9$_z$cySv+pJSaZ z$JdE`P~?juKNVRd<*5?cSL9fcb3`5`@=TF-#;JWBd;19+!izJMF;z3C-_F~o$D&CB z1pHj8a>q36kMj%vxnQRlc+Cf2`mpch^WHCajnQ6r$(=nyFwY9d?edFV(y;I3i&e{e zr{QGMmX8WJ_ra-s(=afC){(}8K&_ub>I?{-hazLUm>KRGxC{;FUd z-(Cn`Aj}(o5?-|QCw|Vd$=$Q~UWRJ3|IK51h2L3V?fGZ7=KC3{&G43&x9G6{sf)~? zat8NjI9)Aa+v=M4u7Wb9_SYSsRj?k zHz$5yoOS{TAyu>Q1#gw6Vc++oZ#)@y*?irKbrorCe**b+{*q=Pn0@Dro7^G>zW&Z$ ztwJz6I%9NRyAaGya)0wdRS0J7uh)IPPY7o1D<&K?GY$LIX>tD8@QX>T{Xjt%fBETa z_a5JPUfPLI)s`ox=zQ4!;$P@R_D{NsTDQr6ErwQi`*lQBjM| zf?aiPXt7W6o~57YO#n`rep=E-NWM1Z%bP!#aaDSC*Jyms==___h?41icQ@ggO47yi ze|`_3&_4g~-}JBwTshs38>&a~aU4QUH~+RbnC zR(tv;0J_fy(#;i9iHs=J^f_zafzgeV{ylqiZ)|km%sv7&2G79Hr47L{nB=aG?yeis z{yjnI)!ejuV@M)&VnLl3PjgUS1d`NK7&|>(7o5dyyLBKHbu2dw@22bAzSfq9{oB%R zJp@w;--AY9FAvWpu^t3YFxXHHtk$VqNn>^!Y@_u&HK7bjFPFy{T=*cgkc1v0@tbCZ z14J$td8)`uMBXm)DUq8*elN0Vg8g(AIYi`sA`cb0R^&R7w~Bm1PGT{T4y$I2T3SiozFlN^n7&A=_Ob>43;0Ez*5%mv&f3ezzauunXUu^*Eq9+t$w z82&MEG9Dh30h3~?W>`FocO*l;xjLhwFddVV(ed!uczC}k%)Y0_!w1I0)1xpQQ%PpT z!&%nn8TV?rBv~Gr$?vh#leY{`J?UORC*8VD-dt4L+ey5>CUVSK*r=K9X=}vMC4&Q# zH=V>%$zOf_B=wtAl2rcf0c8t@)^dRP1c6Vi>648;+1j>&q8ewsf}Ym!Tkn>FMYHe5KtBJy>S--~Q1_hj{Rk>lie zzDRulwqB0!6#1;kPekIqCWIYC;vGi>{M-fsuWBQlDe`)ekBWRl@_I@GxX@yQsp^wPD zL@p3{lE_O$-Ys&Y$j?OT=N>yt`wkU3O=P+4oq9hQl8K>xW)jymHi@%~P2!wllkg}} z9#>(I1dD+=AWIU@IU$Fz#D?3o@{Q)GLw?&LWQ81H)gikT9x-Ndh{udslDcP4!sEt> zl@@-N%p^i=3Gvu5Vx>vA37RDdj~}xnVS>z(l+2!lX)9_)>Zri5>`8be8L`qTve!Wr3<&<_(P)Y-Hc=uwd*Laamd zs4Pk7QCX69&YpxGmBk7@DoYZ&O_ro&_M{=%lh8M^INURP68c6KD|CP?N$3DslJ?I` zN+$iL%wmP6%n3IoA-26RZ)8bAdu2&Ndu2%ihgp)qVV0z6*^{PcPeS2y}of9=BCeiY{L0oQbC~Pt((wGpz|fZqs)| zvHnC*iTLlXxn}pA=KXfVhU5AOSjyqAVo^%9g`&3uwXWF2cT zO(7)hUZ3adnwH9My9a8f>s|UzP8v&!S*ivcfC)&|6hvWmf){p!{SGBVkbZ{`aQv8lSKoaP zD`;$}20umJNPSNG-E9<4B`K-i0_M43__OeRpClYCiRX)aT4bKbkv<}4iM&AMGa|ng zxr_K6FY;88*NgPuH;3Q!JKD3&O!_l@Gt4adH^(fae>2Q%v(U^li{f8h?@!4vnQ4s< zF)PdxvzWFyW+@@dDZVt`u%{T#wrVp-ZH~f|D zHu+m*jwDl*z7EAw0-}bs7HM zJu|?Jqz}0bH{;9%GltGnljwLHA=Au6GsNsc*DgR~TcIPh?Fwq`1;qWVc$GHPYmTHX z^vV(5MA=a`^f(0E586_Pi)(`*t=U`3=X5TW79DwcsN7sY%nwQ0%mxe!`^BbXOK2Q! zz>K#chpxDf&8JswynH&*Ckxu*a638l^14vWqusH2)kx?~hdBetjXi-krictg6aNxT z^IA2qy4bQ0tSD;NkO5EScqL}}2p>8p#cSZiwdGv!I#TT#TP_EFjRihHSB={C>|6e1iYi){}xsUI&8FEX(PP-jQBOzLHUncsk{-Im=CNvNJ)b98& zYJGhi6&%P6V;4HZSL{7F@I7=|h^3OlSM(eVDK-7K3fyQ923@w+^;`XzI?=WrvwW`{ zb>|TIh?v4L-z#63<$L9|`qGc}s-!%A)^GJ|fuwJq*DU$UX z|0S|qt}S;Exx2`{MJ^C|oXGP;{z2p;B3~ByrN{`IZtFtfPkp(5}x2?$DB1emyC32<6UyHm- z%F6{&v$H@B4iwi3Cs$dMwai#%N9uS8xh@-C5o7x}J8k6(K+EkyPZIb7rcBA1Ii zRpcciZx{KL$W0=@7ui%EV00BZMC5)V4;8sq&t|Ipm zd9cXUBF`3ioyZ48z9{ljkwtP7rb=XAkz+;95qXrzGeuq_@;;FpMSdhQUoQFEi0mbD zl*pMPj}&>j$SXzOBk~!M?~BZl`7?S2bj2gyhR}r(9vh`U^ZnPuFgtmuy6gQRZO*cI^54TSYY)7oC3|HLD&9Ibo{)IO~-#%$5J+ltvGSv^mRL+g=z4w>zNdk&rgG&fqy7-hA|1exohP zy_H{tVJ=CJOBX#B(&mz!`o*1Lm`k#{@2o$EwAslGeeMavtUagSMURKH+4s0_UxgCBUg z{Hc&O7jXFDsW|xUn{E!noMo3rWq%DhVfdiDA#w1YtxgWZT)<^V-4TX2+a^wZzy04s zzFB+RP4|XjE_bKr`#&Ah=F!k(^s`}@o!q?VQO|_5x!k+2zB>-?{zBVlW3<-}m>maS zamCePm`&ZrZ=C?l&vUbHw`-EXG;P<(& zhhf%!XRpq0#yA=O`h+<6j7Mk0!A&<@9tSTzKk-(K@0(|Jii2}k4-CUx?seyzO)*aH z`OUyE%-Yj>JRF9(mR}rN`gV+y%UAb`gPV7}C=9dj27C8=C&o#W(i7w0XTSR*4nE_x zq3?#Au@t z@~3^fe;A{Ea?e$9@EvdeHV)32^mH72=lQKZit*iX+44Ae+O4<8!H4eqb{u@^;;N5B zzPUQLw)s;SX1=eTm-k6Xo8c?I+Aj|Ny7I6v%rnGkWBPp>a&oRcdHs<0bQrF-aJT%n zpM|s;zGCv~I5_dUKgGe9-h0UBF;31N@=zSyX-vZ}LfXtpYT~P5m`gIE`OaU4v>Cqc zgwx{S4y`dk#07W3->`IW-J(0U!Oe!M|d(r~Gk#9Q^%rx5U9Wjejo= zzPt6(uVZ{K@V*bjOKhY4VbGdyLfQvCn`{LkM13P>dqdjip$#L)%3x9*o|RCV9yE_g`zh>-{xdviv!@E7`=BtFZT`*FU?aJnT#V zj2y`$_xRo9n-~2({efn_r%Mj9*J{Ht?2Y6}uP3UHZ1H5knzP=zy+>x)i1z>LCmmO< zc+USw_jwm52kYIuG;LX)biCp-ud18p1bj8QIC+lTc?FLgviPFEfMwH@t60*3ernd@ zsS!#2C|0e$?p!ZEa?`&2KT_Z(O8aO86HdKNl$js7q=rh>T%S7rsF z_&K>f_e7KUk#uYlpFm=h_n{u~I4hgZXoy?vz zC?<*2;dof~q>-6Pu)sDdGl>wJG&*|{Ci_SSP%HfWJCdY%P0gNkVD_ZxnMs7$63)n; zgnk(LJ-HU6b7m4D)?wG|N!_z2?VLSnm+VRI_y1^+WYTZSNP7`=wo%ZOS$=rmA$t`543S*)gIPnw=R35Cz{BYzY=OA@8f01Hj9+OZSalSn^m1q7D%oC1e- z<%iRVE=^?Rmn>fGoeFIV_ADbSzbOm_e%(($1+K?m^-FO~k|Nkp4V)z@(6p()?nk_S zgVL*|*q|49w*BZ6IwJds+)LyFktd0~MC9EfH;VjBWWyZJLI3p0P&u9^a;3=Mh`d4M zpGCeU5`6=qwaC6A@#S}fg(BCAyj0{pBA*wDyZZ=byoxb9i5wA zivP#nw*W>_UH#wPJje?Ok3iTY5)}~@H3%w7G%JFlqN1WwMG21}Xn;sSP^qkn6d_gq zmMU7*v_+*Bl(tl{qD>VmT5PFBMT<3BtkhD)>Zi1#{C~fD&z+f_%x)+J@%uUlZqCek z+;i@^&zYUMvuE2q?Y%XfxN&An5A9%|W_7mL*FJk~fn%L#xl+vbT#%+$mxGMD)pt@*5 zYzOGeAj`*Z8zH|I8&3=e%mQyG637lj06b|1y%*Ata9oWBaJdV>zK1NQ+cx-N*(=SM(w%lW=~A21ZW z^+=8a4t@#X`AX1f>rot6BbjnWu$M+8vaid@w$=>$^nE34yX73IMgltfe9i?F7ef~G zpFrL%=e_D)KtJ$SA%W$X!2h^#x!X=(Q!uI?Dje zU>NAM^(2m~kxV&FyV=*}WIIg2K7C&U+ip4UQygX=^QxtC37OvsE@=UzhU&K!4b$@6W-u zTh0d+$EaG+L3V&+V;$t_^RGd5%lW!`9nb)JLHA^x1^_eI4jyeikK<}2Q_i>5+kkyt z&Q*YN_(k72$+_k1qPhTvgATF-rvgSmo<6?-s$0(I)$@R9;8ixyPtv&qzzoVkr>z%p zT#aPP`KWpnu&>Hloz*LAOXkYVnVCZ~i!(Q8EX}CPsL067*brS3t&LVj3!=@Dm61eb zXyi|w@9BI=-kQ$UShv8rXhh8c;_v@Q;5?$*>)-!J7AFoczp`Qfb_!`0A7Q9q2=S#xN2C2Uaw)N&dO-ly$ zTSWeu>_QBNy{t=AW&6oS`Y1m+9;en-ezM7EQZRW+F!}0Wa=o8yJeg(4PP1fv5~Nwa z@^3UtY(1=-<^F7%y#KlFf7f0HU1)7Ybp7P^So@H>M4 zDY#JbIaKh;f=zp5>mp!#2K-HGriR=-m^?n1T<0abd0*`%t2oX8iK?0S8(^{xJPaWB z_LEH)XwhLz-qL#AUT4VPG@0l|ZGQSDT{r50O$0dnXm?I}x;mD?uAIM9og z@&HfOt1*@9`rjkBb&Q**1M1TTcH&zAJ$$>Y*ORW^Iya|>5rB> zbrakLp7<=s(*=SW#S!t3?3PC80zne@&U?L;#@YV&ziOp%-q`KoJnMRJH~M(=9R;pL zkRLST>)k-|-Z&>OnOLag;iyXJc6OVXM7kIwaE?}FR)a6%<7$hc+u%-)e zX>EPd-60OveuKT#1@!F9>S8$w!3`@}Vh=0S7}#HbZG{s5A0E?mg|dgb6&f@SBufNN zQmyyU{Z*C5?tfc_x@*o<73xX^R_MA`hupA2(?wu!4!H;XEz!zCb79|!o@HcEl}Bft z*UC~f*@|uy+&9>^6D~zxmquY}7IUuSXN=MXrEQ$x13p;xLO-}9Ib1G5WWW!C)pzE&>hUOVDjo|Rcp zt2$%a6wm4|NaD#g7q_xfJu)lqS*Zr)asS!9T3M-fxU9c zahYf3?#n~R^e=-?^IW_Jc{<{@qdXU{K@u;%+NG7gT-kkBEAe>biuYQHNBPR%dEyb| zM{+y@r+}sMx;k4O!D4e}SGVSDfBdCCHvJ!7r0J%2|JF_}k9gAM{G;p7U?yQeA=C{&W%m4auE2X`o z&*oN2n|a;ZR?2eCGs`_?DNl}v_H=9BcRgkCN$7}Oa=|xS>8$I&SJO&oO|}x)Sv#!> z?-KndgOGn}{!i`_B{$!|>gpO+*MCx5NiT6TqdlxH-G`r6)v5cimZ&&mNa{We>zsY; zeAwc~q0S-so``SEV*$P*_>Y=-`>y-rpHi0}Pv)uujuGB4{{}stDlNs^ft-YO(MWh8?e}_Q? zx*G6n5pPm{v)$~->hleW7f07WX-422F<|kJA3pr#tqWt7OjTQ#ooF<^`oCjgl8Nq_ zY4BAvjllXek$byx?;L*9e{^_&b6h7W^y0n*@I-IGYc(0LldS z6MUB7F@moZyio8%f}a-rir{U6GxSR%O2q{C5j;fjD8bhV{%ZWj}kms@JPY+g69kVzTnk@e<%1ag3Zl>Vd&EY=dOSuFLcOkJ!qMR%$>^!c#PXt~5Wq z;E*#1;tY_e>Vm%xSvkewTQ&}vyU-C5Rh&8;a-Bowh~$ttSP~LdeCx^~yP+!elAGf= z10<^W_?aUecQQH1OHMfC!@OjgH0cO0Svk_Zy<|5geCNh7$qWdID)SDt)VwQwG?`M3Xl7~5YALAv*9Wq}ibTV;6b)1*%7Uy^`xzWj_e-b&4GeDy11pIaK zE_9?hzdGdRIL-ixssZ@xklj-9Cka4%oCA)sdy<|6UsyUgs5j@pP zUgqRI$V+zp9_%G2;y42&s!qq>fV_uz$(x+K&+wAzph;(W$&DZr5>@BmZ$RFBXxkyX zg&!77=EBI4cJm(YB`4xI10 zNBUAPxiOA2K%#0S{yKR#$4Mla&wo1PrZ|ZtUyi>H*=>WPykxieRC~#8CZoM%H})WLJ99&`ARvvMXKu#2F_$WY^?* zZ=O^YKt6VIJFb!ZH>oGz5gp`^-Mk-q?9(7}w_Sfa&5=$xelIxv`5_M3_4~M0KRnAJ zyVA>cE;u`Ye8I#C!ve_9{bU&5)Hi-JZ za}!7cEUkUOR^xwU&7m8ePN2TRPLtIq;nCKlj|K&tIv! z#k(ad^7;jbT|kXNsr@RvF0Ms@PuTYRYreepjVgQb$j@^dNLi|;Ym7GVCsX@h`oh^S zd$eC#KlE#H@yQr4vHt!yTzn3Yi_L@E!ePJ>f_t$50R5XA@I`VyN$?!O-xK^(!7m7I z7W|pucIW|wLj+d}zCiGmf^QVOSn#8Qe=Yb;!FEfL{4A62L4r>ZY&Vm;Le6gx{9VDz z1wSkJ4Z$A?&XJ47?t+gKe74|mg0B~Rhu|LxZW8>O;12|6$wgwR;J$*-6l}K~nJMSD z3w}`WQ-U`N{+r;aTqJfATp{>$!Iul3F1SJP4+Z~1@b3k06}(Gu7hduJjubpd@TG#M z3cgivqu|E{|5ot3f_Dn;Bo~W^3qD2g2*FbX&lP;H;8lWuBlsP`{}fy(7mJ4qK3VXE zf@=leEchP5KM}l6@LPgE72H<(OAodeQ|Wr3s0uUdOhb5g`5Ihd-O?kX@7aeDi-?GOsvICP`PFu5`h#-`vxS zQ8$wt+WmT#<4I%Onv`o)f6Z^d=#d*B%_UHS_e&eNM4Wt@(H(1$=MvHPwS{WAL=#47ccS;&R5CB`e`AX4b`20hEylDO)-%bYb%IqHb#{5?4i56=CjOqsOzrVKV z#O6Wk;(runhMGl_*a9YU5o;OKY;PLmn0w!^k(<6VzY=-r;s|8%GSHnZmcP3Hy8NY z&5xwrSTT#4C07Fm@4vtF$0l>@G7)$E;_?0k|8p}O?+A83jAzYh%J*DZe`q^Iw@FoK zjri^Hr|exHlST8{V}_-u4q2{1Cwj!Uy1f3|53BBN@+>LTc6-BAhtg!Xy{g9p z@Y~~md~6c_e{S*~cz;~;hu$6^yYT-#bMCtBRY^@^wse3y1+NgiR`4GM|3h%D+)^tS ze7xXu1lI_jCHOmn9~S&8!J7nsC^%bgsg()tC-^MEV+3C-c%k5j1V1hK6~WsCXGqXv zg8K*_B6yVGYXpB=@KV7~3VvDeUj-|zbnp9+3KaI@gg z1hkz?}f-ew!rQjO{FBbf$;9m=VQ}8E(^UdU<4ibEV;9-KV5PXB+?+RWn_*ubk z2>wWLjx24u3qDTp*@DLjzFzPhf`25qN$_ieKMc(mY|f^Qf6px~zj zZxsAD!BLsex(Tije7fMv1y2{;Aoz!Ze5#VsarwAS)c#7b;g6|c)O7L$4za#jcf(!Xf65vq5Ckwt%aIN5* z1>Yn1CxX`reoOGDg4^<;CO{9t0|cKhc%tBh;JXArBKSGMn+1O?IFC<70S*-GzpNz> z^M*@qigQ{_zDbWEJ+8?dgp#BUnSCaJ%qk8b)3X3_(gRssFqpi%2TLCuOg=Q2e1xCe z7*{A|A3xccJl0P((n${=xeju^ODayY&iiyf+2nnepKPQr@RN=7#lhsHr(Rr7Mg>cc z^^+UpEd0b^@)SSWcv9~t8^5m)Cf^)PUJy+Fj-PBCyxUJUo^WfXq<9%rtV{p992+sV6r zvhn+`!Q{UOlRxs4O-w%XlTF^A`^m-=zStR1^DTC?GI{ew=_F}G?&K#Mlia5+N!pN0 zg2~;3$p`z%&2dJMdl@F>Z9M7YCmWN;29rxHqvMK$wvBYKe<`^ z%}vq*^8Q9JnRg|Uq>ah3ezGxnMKHO=PJBkX#g==9++uG%L!J?w_w{~qqb}u*!Q^lG z$tLdwesV%*vd~X%*5t*0vdLsgFuBoBHkm97Ca?69P2Q{gWRuC7VDef&*<`XVn7lri zydjvp(N8v>Z1$6l$>w14mSFPMVDh$L^7dfzC&A<$!Q`F6WL|P7HG5MW?yeI+&Iu+L z1d|Jc$(@7A#lhs#U~+jdxkoU$S1`GEFu5X_+%K5iKbTw@OpXVW2L+Rd1e1pblZOS9 zhX<2K1d~SwldFTt}=$c^)2-% zM0gy2y#8;B>;Ja0njXY{F%Y-^qe<<+*5fGD^b|a7@V~8Wd*bg`(JyQ~k3w9-{;?;u zwC{DiGfUbjC1i#X2qO?iAdEm5fiMDL1i}b}5eOp?Mj(tp7=bVXVFbbmgb@fM5Jn)3 zKp25A0$~Kg2&9O>%#3Ok;d_%&6)_^*?UfK!BxkEnyB`QlCSM1Q<3L{D#F>7XZH>*Q{J$fYyh`M(wkP>=6TPQWGrlkm#>D0PkA zRbBNoKmF%Hv>W(S@v1Igim#!9@bbYc!3*xwz$b4aWGs(QF?28#hn59e5onX4!yPuQ zY(BacZ*`R9UuAT}u&4eK?~ng;KtVB>=;J-RuNDbsvzW?=J%@8V-N_}%pO2J~>c zDX{P|!RrK?*Y6C_x~iFwy%v^hRII0|4*Jp!<)b&;cfMZzYQE(e9qv*;Ra;V`Qv{td zb(%vzL!E++=vi))Cw(tLZc|aJ>B!mmVR(#*8$Uzq0$Nu{apMNcTKg;q>61b8=FtZ9 zZt5y{do5~+@pEl=1FuMUx)F#^T|w`zUw9u2?sy!rypRxn2k=XDOPL8<^n8ZHGqIke zJ>kX@lRfrg+Mc(LO_@4^ewaEJIdMmS#;O+oPJ`94@OKL6uFu7gEkoI_fPH=$fD&Fl z+p1{`^{_rww`8`1~oD*=5va-D)Gj|N`}kNI_j zpA*5W1J|@IqsRD`Ap+x&+jy;C3n|((eD<-f;7>t*rX3qP>+N8nvpsU8VHvzKY?sWN zx@K5Ft{oJ)ky%}$t$<*{Dbx2NdRvLA8$FnaDd=H_MkH9eV(wm2P_BZA8} z{lLWR3fP(8DPzmA&e&nRyCJ{n@L`Ph-Hi+Du^YS_kAG~r-k7m%wQTdX%dGz#8_J+z zMl)M-H*fYC)^k$sQg)6X91H7opBd}KgyU8>&^d3g?#-NF%HbbBtsm?g-J!z~m^EWP zQa#PL4NN=c7|Q%uv#4X?nKD?O9Yau0!l%t5#Lmngs1uNI2rlb8dCnOvJeL1pXmSLe0zcV* z*%Qa2^(c{H9Fk*-cnXiP=^U>kptVg?ZF-uABw21_8}SqxZJSuICsU(FO&1<*dwGmwz3_~EGeeC=^vAKx z!lV6eh#@^N<2m9fJi8XDK~#+%KBXo+Ggq^3)QTRqcM_hdZ`&ql5AhV9S(g}|vB$P# z%52tdY;7EEsfTtcJTp!kp3%eD&@;b9J!J{a#HwD8kZd1pbsdCf`iAY%jD^XEadP`5 z;wf}fM`qrb4(~F1n(uD7bp$trM!Q{Ms|Kx+HpdCwv_o&Zae1`cU39z>HcwMWb}ZzG z^u=<^V;z-Z+&V+O2;G#y8#AoD zglFoRV-Dv!#8cMSoSP0rq*`8Gz(lV|NI8vJxt}Qp$5G82QrX?lwxXv$;Il!;S^?3oUfdR~5Xf9h9CPXY96HAarT2H}9GhJF393x;G1m+>E`9KcJ$%|wcpR6ydCJ^JuP2Osj!RzNF&qs=&-8gW z&%SIs!egKJ>hsZu>ZXnEr0*$Do}U-`U?? zdADxZ$6b0ql`Hb>*Df7i37vh}r5~rR5<2^^OFv%a3H`t%dViHK^n;SL~e7ruaC*d99;~j$@ajo!r`gncS@s8f1K3+eCc!^#wACI5?=_I_ve7xhp z>nzt9>^Ge-$LN)g&`dw&*mDi&oHHiFj=A1qzd0DQ4zEkt3podkh5sCVx{8dsM(22K zHeBQ^P%J!i?|?kc4ED+baTLC}H)Hwk_03hnXTK_gS4Q8?LC2_Lh0p%gUGwYp)}B_P zO!(|)hR@M!qAmwVO`AXan^)gn{aL=b_eA@nF(z{kGgpTP_B;kr^z^-;$NkMm8D_NPYIhs}#)y?0K%O5{1- zrn(n%tjO50-rQwjB>Sl2gvWNn`!HrSH?y%VFWXNUX5Qqlek$}EQ$Dt#BE+0`C8=32 zbhevL$a4aERDI7gop^Gs!?~JmtW4-8re>ZpF*WjxX&J{l!~&~mncaA8Yxs<P+mMZBj?j&N?4#~=w-O%x^Ivyco@uLgO@tO8I<~Ev_J(yw z&o+*)MX+J+k)Z7eoxXB?W3C~1zro1U-x9RG8K_C#qhkB07ao1~*WYyE(dQzxN;4Xw zv_hx9C1_7qfM)WqQ^eQyiE_}dd%J@N8R_#a^l8&ie}Bv`;EG%s4U?#e%(EBvXQj< zCXUph$5%pfs*|^Eo8+;_kQbGFP2HO-cC!x0{Vn0OY?Ej^!ZWe7@#j5Km&aIgu4Q>m zdGM=_{vFJ;<(B0{TM$0Wd9b6$IJozst`!-UwL3;0u1dZ9iNbH$ZctysGkuZ1wH))Z zMTX@*SjUmSw@emqWGwH=Zw{JrbaQ-Q+|hP~$1)_hTf8|^v68B=HOuLPr!UzzYsof#f|=Y8v_@K|U39f@?7hI&ePrp^q{=%HN- zkL|t$8oWPw6{2D8ueMDQ2kIFf<8X)*BU6vO*KU4AK-&>H#w0mjs2|~(x@3#RybsIQ zvNnXrIC$sYsL)LeymK#CKWcT($efuuiQM=5(p;Qr=}pmtkE#DJt%|xyzC+6JOQyw0_qhjs4Pxw!Mr zPR*TiIt?l)DCkwND!+G!-W@x4+}UAEhxHv+by(72PKRwBH*{RpadF349jiMI>R8)h zasH~ZS!IjM)|d4!8(vnOzp-$8VPS_J`8)Dv<*zD?=NIHJE^N+QnYSo!U0xz@XPa?t zX0}=0rm0P3&Z0KcidGd3FX~*>uV_c-jYW%!Hg;Z`@*nGQNSlf_g>62`uI{#|+m>!B zwys-`*vMEsHnZExZbQ25Y@aAB&)t?&TDU2vvam9DWMNKj=aNKhXh~yiM{IMfDOORk zzGOnlyppXY1*OYNHfFEMZp@ySU7NkB-O%i&b{pF-ZCBC0clM5U#qA5TKgrsh)s)qk zRoi}H`yuTcvg)#iXZ6b}%v#lcN9Lx?HJOc>b24i)hh+B7EXZtVw=H8s#_Ej488b6R zWc1G{&e#^+7+oE$YqumiD>^PZBw7(Ij%G%;M%G1EMixb8MV7bi*H*Qg5GidtyzS7) zwt~`j>k4{D7PifaY*$;_Zc=q^*Q#Y|UE2oLzuky-)hXZq=j9FG|34U*x3lc~|N4hO zoD-gHKg-;8HK!^5{yXpgGdpwhEJbE5$l?3{EkY6!!U%*B2qO?iAdEm5fiMDL1i}b} z5eOp?Mj(tp7=bVXVFbbmgb@fM5Jn)3Kp25A0$~Kg2!s&`BM?U5zbpdI`~NrDAKmfr zp@y#b0)SErI}U8y1DLEAeKqel3ZQU8VPi5B){dO?x3W7wFRS;qR91!CNQ8A;GO4Y}?@Lp%Jxu zAA8_!pQoZ0xeWz39heS3_?V=rM;j}a;Am{uz(=sB zesco_^D6bY7GCq|p@@3*Yv{E<+8mA8+iEc4u(h}?i}k@*#91q*PjO6)sEuF4QYF{L zzf&g801?%&kIR%C+rj9&e4LddxH&TMHBW=x^OgEy#*8aa%bbPSL&qkKvc@yMfEH0p zz6PFM03SJ$@R4le8y`N6s0Y6Wz70YT;vCP%+WAtT8SRXhe7-QEN-=K^#?~vRs0%T> z4_7_AfDAg*oqM4Kc4Q5jIfqFN@5T(Oy)vtbuga_4m`Sx)W|eW@UWiq4pY+aLM<=bb zc5fatHEC8I`+A;F_S_jmbbQQ8V{fd&lC31iCz%&ChM0JmRY!|f-_>pPdt*#V*Xmnu z?a5{7seLnTe_#97dYcdO&Gdk|`?v=rTlUsI>+au!**@{%fYnDXh~*${2anfT8?iq` zUSzZy4cOLuLCmYt53n7w^N>CQqcc(?z*aUg{{0SItIX_pQ1J+h7h)qLT=`(eg;`k8&&qv^xw*Cjl)#U4P4pl<| z{&Ip1Xl&F-CHr7#>Hqr6*$prc_UZelP<6}srTP-U`cNtnH>(Jxehg@WJbnHQ@@_dd zsZD_8eHO$m3s2Yh~zgQGC*ajVuu~U8NpAF>bFo@(leB)(f7Dp z4t&Vjp!!iiQ|)3gRAu?~v5oJ}_t_^WJzNEt*LOjz80G5-(LqQQTT< z$jv(e37EPovB=q=R;ZPkcc?o6l%t)FafKB&b=ji`+^)bL8%pxuiin*w`08ycNq?Lp z66aljARosI{>B2L63t!8pqX0<~r|e zbvD3rod?eD!_w%&=*;Mvf;su+1tap_$ooa^Z8<%1C*FjL@={FW0(58;v;aw3#BgZ{tz~>FxLV0_y2OwMZxvucfU;ObWowM zBC%P`%LDo)whZXkMs3SfC+UBu7o=x>izwnZ%YyQW}Z@acAud5d^vyex4-{acz*w1^~I0y zwXO7km#`u#L-Dcw5W)zA5eOp?Mj(tp7=bVXVFbbmgb@fM5Jn)3Kp25A0$~Kg2!s&` zBM?R)j6fKHFalu&!U%*B2qO?iAdEm5fqfDI{Ql1kpQHLGejHpPR-*d%|7`VX_d`MP z{{DZc=lB0t+JAF_D5OD`r{N{DBF@tW$@Fw*;oJY|q7(AM2!s&`BM?R)j6fKHFalu& z!U%*B2qO?iAdEm5fiMDL1i}b}5eOp?Mj(tp7=bVXVFbbmgb@fM5Jup?Ap%dQdHu<6CC57ANcMj7;7P2D6>Vb?0 zbRV{~Qs}Z9KLhB6W7_-;&PiMQ&j;0O(eGz}AD}(~h|)sH(dK%b4??27l7bJ^2Y?<~ zvtk>O2SpQ^{fPc;coIORCfJ})FX5P9BVqa9$XuqD0j@xOO_SQH0q+Yy4s6r6-{PEc z81elds9AaLce6m!a9W1@eMw8(`qD%Ckl$;mLq4?4kF&VtL(c_dX3vUk29LsfTE3nD z>Nmm;ecpg$w|qCM8v*|EZ3JwEEPeYuKogGX z^G2MLX4++Gb}4}E^b7!y>eXgej5c4vv0JW7)un(2@M^)M+@6-J9f10E$csMlBb>He zeG48|4+F?2OvO0Qa&^bQmQaqbWbWFv3Hi|H*C62fdzrcnK%GJ05$~zLIRNSx=Ahjm zuT41ah-CWFo$5}2`Cij>c*{|f-`{%{00fu`J^J`Mj)x$zKV6);P%Q*3>NG31CD-`Z z@6%hgpESmliAs6~NwNW@C6vo3^c)}u`OwEVAXbOO@#Nwh^L^&b0%M~>&5Etct!|kS zC~O1ei5s*Jy>Q$E`H>a`5%DV3*Gc)k=5^3#+5dVP`_~k|#f{V5f_RctaMVjBj!B}sd9n>Ya_sa2zag%WFJtj1Fe$@0yr1`AHoqh7 zZ}^i0UJ%x^(<1QW{pc>7va3&5!c*5&0LhDhtR)IG;10Ge2Sq-JEp_Der^c;0Q?y+41J0=-+{~^B-$$}FyGJK z4BjH}W);qg?diC~Z)E4)sP0;fyy(-PVZ$xgchz?RAZb{sMn{9nwFceZ9@S>Ry0Z)uvkQuLH!@O6b$q_n>Rz@>c#LwFm%`22M1HOXfov4=Eno?^v&g z9?yRTXvQ&p*@|=0Onsk_%{Db|%&5_0$JW%>j~+K^;$+i;hqRj&qwT*!){T$(p7?U` z=72XPCwq_Q8-6oszowu^ob>pe?i3S3L3j-FF*^=eh-2FP0OzEcdOI@vNPwCN_`!0uGxBhB2V`jTL&&)0pP^;| z8qhy0!JCP+r{zBg5XbD)3whBeF4{Own)SgsdLHnvLpg`kL7u*S1X;$xth4bUKLAcO z)L&aaJ>5EV0$>yJq3wS_!!6&tiq}829cIM_fyd1Dw0tW8jmRShdC}*Ok(XP(SMe3~ zS6}s)?`FU-$kVq^An%rMj2Z)=KLqx-bmco9up0T$HW%k^`ONxmP{&!Z9^kS5_q2Rm z-(7|K847vP=TDKBZI`?9uU1zBK+;fvzd_?{DRkKfdH{Oim_C1obJ9$^%*@UN(9iP# zx8kPHLdenP4$$0kU8$}Fd;|0~Jg->BaJKvK)WV?*0hfA0fqM;9&-Tx6aRZ6{3N-?H^x=5WY5+5F&Y14Pc@HGU^U|CT z)rWwcC>KcD?^NsTUjUwN+eY>8f_V&i(NH6F%sTrX#qY*4kKKWIl2GtEdk*X*iTxWV z!=cNu(+~WH?F8@`3*NJ(4CC;AUUhagz~AnV1vEpRWsXALU1vX`o&ebV*{}EJI(r+S z7uq;|&467yp6tqhT5-K2sT;a*fI!1z;X|0Lm_e9Bt+#m1~E-zNqbn@gI5YjI53B>3GU@;<8z%WNd;B`jiVh z2f?mcXa8C88pf=%)7=q&3=oMdhJHDGqR)Ar_`H?BL@fcZTm*@aUT-sKcD-E*U7o)H z7=~l|l#hH!Gxh#tHt$zryn>(%_T)L8%)n@~OBfWY#PKdsR5qz`J+p)}uoKLrQUdjC_ic%C|_)~nMm}xOH%o!sc8Uz`3?j$L7u*KO)B3Dy3g72?Tq|SG+p`F zmwS~N+r>%cGj>;jw+J>ke(h=b=<9ggBdtST^tqe(%W-{I{(7|@VEvWxq{V&h2I$g< zy8(-FOrP0MNi*$ocJ^!lNa}DvIr!=TtTTX1lFD_iIu|ewyg}gc2ZcQ?R}3%&^*#i7 z(I?(ixASA)0@E&$y$1T3ZX98IU5R|?b6JwV?)6hCc>l?DJFl&_5|9slJ^*&y_4YT_ zHv#^22TBC^^2^nbABHtGee4dsAt;YoZ}(UI0ZU(;5!=}`L(j`|zBKFYJjgK3!&*C@ zoqD~^`M+F`FiK4Vlp`PdSPnaN&}TcjIOi?(7NGQ5W1}4O-Cb{2B0ppm2(7KR=L7nn zjw@6@Rjt;l(u@t!hUk#!&d8d`v`9r{2dJsu|1X0@zW;w1Fzxf&gX30}$C-<6>oOmt zR^akh_%1u5TcF2)%Sw6FKj^2Hl+qz1j6fKHFalu&!U%*B2qO?iAdEm5fiMDL1i}b} z5eOp?Mj(tp7=bVXVFbbmgb@fM5Jn)3Kp25A0$~Kg2>joQz??{RM8E$Z!P6bi{{MW! zme5H*TXAIBis<1u<1g}j$DtZYKNJW|xTxyJKbfP{e+%){?or5qc^oM}?GrJzQB7n| z#4%5M^ACWCN!VB7n5TG5OoNYom9Y7+1;NLz6}EjS-p8IKY`PerJvqJhl=SR6Vb3&q z`(3*_J$tIKQq-L`FnT zh{PhFtIg^ub)TB8Hb$yd$LO$VpJ;@ev2ar+4g8g#&>cI+EA?sVwyYz7$^8!gYym#W zisE=?`6b*gFD+!3|0;8P)vvgP1R#MFQQ4K3YK%XCIY^{&dlx!G;I;y!ovAS?N_9md zjh-Q`Egqa(%O1x)FBO< zLpXALc7in8u)0?6G7pVAD^SkvtbkL!qbO-_pHOzPjRAi>w{n(Nj*Llr@YXMnur>}9 z+WD1r$6MM#LgTJwmUgg*X7lSIG{)J|4iOq-YH2-%_QUOCvMudUp|L(XArblut$5JU z+z3X)2|_!r>Q=g-;Y1J3#(sd%@*lgWr?pWjG{&lf=&}Ve25Xmp3mx<`8S+FrocqS=qUkcDT^`9{ab$tzA|$bvGB?TWV>1RED%q9{Apsmd2-R zNc+L_Hx0z02J_@icI8R03_H)#jutu6tlfmr#{A-!&Tb>tzc_NTHmu$AzjHeu^3Y)I z{$t9S+(b!(wJ|Jy>jbN7Lp~dBX|^vkUoq180Ev|w zx8&JzR?f!xrn}1c_>2ZyHqxx!8>PI3Z*FTNLzB8mXn7YM#7%xQ*!-?N`8#|{NrR0G zX*NGwZ}ug(XI01SC!POR?PIeOp65#ZCGW7}_2+|$o%w*fM=(=ciG><$O) zfZa+Yj`DMc%-8zMub&&^UW6>`Vx&XBvvxCM<*FRuwYy5nTRX9JyY$btG9E8I!`M8i zX-;h9uNTCo0~#-wA1g#zE&<=#J+{5skJoFrx0JV_zID5da}>K5ZbhB;{@om>e(8h4 z{!iT3SFJbk)3g+SHa{Zu95;Sf2xk6;^Jc`FE}9>^84ZbkFK%3+-fm;QzmViNh13PM!tZ;u}#nOV4eH4Sk6|Zm%-@?N$6HLjrmgh~reT zyXBb`>h#PXsviQpc85x=hgLVlmekIT&4S&{ch88GPHAbEY$M8=iAMlw z^GiGlNX)(YDiF7IH_VScBzAYUU!gvWG^=I+?Xs@e|E*odnY!t~)^9@Wt^#I!8j;w~ ze-22DnHwuSYrg(oiR}+>6wO!M)5>di3FK&N=>KcoF6Ghz_vl&-UsfW|-$T&aeZ9!+ z2S~ddGri?qen;zeS>DAcOC8cGjIk`Q*AMOyxNy^)*jA)IVwdCWhtbCr_j~l#?{dgc zcW6!Pb}9ELfSAA-M^OTP^MU8wQ&SQ|^=cKw0+0btQxrd=!qW~_8Z__ND)FiY^^ z&j5uZ8e+q~H6zwn@}>RU$d>39!1lN9*3Tg`o~5rWh;dJ{wdc-{`M)FM%U1ma(1bpp zK>xot$zLyA_GoQH;aR(^sfda^|UdfK>Um7Kb+h%PNEh z9Ms8tfeo=5BW+?y0}rGq(c$x_s)~*kwui-mJK1 zd&+zvn+~`KJjd`xq$#%EbbMRMx0U!Z-$IVRm|O0)@zwppj34xuZMQ``OXn38(YFEY7rX*v-nAP|zgRx1^?tDmpoYzlRYR}oJhz|XRITf5#+SEX zkK@L$FPEzU%Ir^0KDQPpCX`<_H?}!R&g=_Jp8ftqPREAW2*|zekt1L4_YJ%n!1F}? z+}J|M{hTL&IQ$!+%)Yiz)!)D%eH~yX8Mp#+D{*Y|Bb|H6SH86%=9B|6BarN%O1r1#jZ)k%dE}oK#JFEF^_Um2 z0?q+4a%O+#ZEr4!F;B9a(N>m0W*LsH-LrGueZaZbHsunK*?{zrM~?Jr&^n(#KgNB< zdCt6cAU((v0PUWYi#;F#m5}2e=9BRyKjuaL14!1tlH6}Zxi38FcD+@Oxo{@>_I(I` z98|MkJHCzxppwe}0B(XIv{)BCWp!YcZs4-@rNpsQ_uo2&`$5*v_G*C~NHwQ0BWw^lc^j<5sM- zu7*q;$@m}F-{jc%+MHMe(jcUruVP+CszvI7wE2}eu|-Hjk)WpXk=XtkUN-f{@6YfX zAc<$@#5Q5=b|rXmB$I!cDg*pG{zFyAt>I?OB{=TAc0p_ipc(nk!y0rPXmKPHpELCL z&qfx_kFCLV(zN3Fv3@bc=!FHb0-O)WoWA5Y3u2qsFNkq{XCZlg7g79{ni`Jz00QNh z&-tNFLZ-$U>Ve1uigEKn)OW5r|87BS+;11ew)DR~#&78jP#35TxUQqzwMeXZ6BqNn zK(_t$=qu#2FU&$JKw7eSK`ah`mXDnqv)=q~c{+x8r(D6Y+=RodxF4wGzKk z(v19OUN}EiFHGjMIQMdOIlzz}d1SftZL9Ca`2glufjmejW_(OO!xWeLSHR~D=v z(t_X}KppxD^Vp75D?+ARv-CIpNUHlD)?v8*TZD>Z0asqWLJceIrFZI09Q-|H*Vm$+ z5^=v@UUS89J=TBd{Me12{APEq(cfxderzA!H7H{n1RNhppLsXdpI9T^13~)7b#0I0 zAFCe&n4hjY&zd$>eqREZUmRmk;l??!@8XyS7>{>5o9{;TSmRz#@cPeQ6TT#UgZj*$ z;|MXoBvp>_pc&)%RGc$E_J^Mr7V9sItbfG4{`6i?+VW>Yz7qP(i|K5D!Whc7v*9vh zqX~7GgYj=JXhV_A`oC0<6qMJfMzj=tA!%F(Zb zSy$NaH`3NHq&d)Y?V0ax(q19xTraJ`xJ!E+`%j9Tgm&H4-ax}|63ORnw3e~AvC!DF z-`}LI#Yi_L*)!iwr9IvgBJ>k`oNxU3`_HrW3~KC6gS`p_m)};MpE*F$Rx?rpdAj8@ z{haprO(DYa-<$Grj^ns1S!$mDJWG9{uiw}%I!pOD9`L>lZS}%@b^|nBduBYKJ^qS8 z=q>g*uRaicKzZj0|9K|v2vCRiR<$?rR3w+n!~u|_y-(Vi^4af|($+%IXM*qAGv6biJ-yfiZw=-^=E6Mu`TNf!dZstBi^QJ(W&!le zq0c@(1INRV*#9nw{6l~5ZvE?b>wUOER)b)VwmH}P=V|tR-DW5#uxqwHz;M_Q>j#@# zv2VZrmLB@=ri>Ah3F!ZfFQxjSZdOiMp(15wAN>*Nf2{#!IHu@p8?*~6Pg*)C9BIZK zzaGc!bdbtkIvw&7DeSeT*P1_8Kl58Ah6e&j+YWpEv*txB61Y!__&y7ojqm(Sv!B0> zZ|@Ce?|GY-7pE#O$8;}LqaMBIsr0-uLC2}|{PuEgnh|TBKOW#EkKRsq-Y7-{pZ&_x=Gl!>$k*XsPVdQw zx{Hw3KyD~-CXWZf7o^@u8*$I10cj9YU%*Vvznp{TA(rlVW4^!3@uoS-e|4F4nQOD` zzq-ukXm!@gtmT=TvgT!ti%e7VRAzLED$k5ZSE}ui&5??X;^TUyA)Jbh{X`jdpb-w?-ICdR@%C6S0L zb^56|1@L(P0@r0;;Qc)Ue;FsR?GmmqNO65Y;JTEs+#u(>a&O4_M}l)CpYDPSbrc%o zhMlM)MoTi}%>yl&(hj-YAxFLBVW(JWwg*RA#Vr{mmt5{hv&fFLOJ+lJ$W3va0TNZb z3E`04yjhnH*%X7)2N|+$jZQ0;(%V+tgjQU^<_jP?tgwP2!`)(<`THz&2N zTru>%0k7YB?*I?$D?8*Goe3qDXBZg#VYU^c787wdLFg+6K7Zqd207vH@C2@`3A}%)KV1er`_Xde}UdM$&0QH^b*yPMafHH#-(K z5$7pz6^rkZr8Oj~*g`-iH>p83O^Dkko1|SM82u~ zq>SAi1QS(gMEiXz=Ov=Oo%_F`5nU*Q-UEVH2p)lQ5T+QU<_f-7@G8N-5&Vwee+n*? zeE1+0!7dfjPVIjhXoP)@aIZ}5@l$NxNmF};Lr$97l|xRN+T(GX3F|hgmvG!pRCV!_ zDeuhqj73uCX`T?b>r}4)02s}m2<|*}Zs+;%mJi}jUh-JW&O-wPSqB%O^PGEtA#nvU z@A3EbI#~bcgL8{1VOJ32JKR5js|eD*Y6xCIoa-5}5^;o6(pT-BQvMOxt|06qp!|KB z@YSs#DxKJ*T0wA79`~@RckNvB#Q0k!`l$64M4~>fB`wCu=Re%4+mOlO%6L0IIt^%b zH4?u$t_6qO9G~&>&wkjj>4K`p#mRYXmchT(ywCHum+ z?t3p~U-9Z=&&+BXrnYvZVq zCbE}BM&ru3y<}p;2c%w&Z2wkVOYHbo{N3;Vx$obL`cx$i&i~=crbUDFt!!?^;JkYc z^6R{^`T90UyR!L68sa|%f1Oq~r2};f#0o(gv{@dx*OY9;POng=y+Rr!m;7~D*`(`; z@~a6t;?ILuHlB|7qr)D*;gEmbp4<`t!&Op?j_A8ieG@ao?yi!;nZY#JbbnLL41=Wu zp8ZwK4C$6Vtijw{MntWw$Q@!dWI= zqqaPMQRNgM$Ig9V4Pj1GtI)_6RwshGj`==wQbr*3tYv7Omsc(OCawM?sdc{;V7 zu~K#FR`ar**<$!*JGBXxGynhJ{pEubw~@V7KVPSOrnNu6eMS4Cw&U}k&wU{G=G@V_Rk>xkM|RxV zegmEaSl#~4_T{Blb-k_gg!~9^YDRa7^Op#Y>R;Bf)u-K$1ce=YKK}d#nD5+J`100Q z?Bi>e6o4-epaqj6`uDwvdJpV~8V-vQ#mPIOuGD|8(tne6`*%-156{8~gb@fM5Jn)3 zKp25A0$~Kg2!s&`BM?R)j6fKHFalu&!U%*B2qO?iAdEm5fiMDL1i}b}5eOp?Mj(v9 ze^UhF**mkIR@Hd_AEm|vadDuCI!^V~c#wX}a%KBZ4>(GnE5&CPpFr~d{@>+;MIVBc z77CH4(ywaiEni^6g$g+&ErG;+#|$4YffRZ*`NSTRh5m9tS^_BxT*LQk@_96QXcI?f z??htK5=gmtpvmz4ns}xQ9=Tv`l9oVfi~Rr$->+%kk+Qn8?E!ECi4QlM_h{@A{U-0aRgw8_1A{INBfj2n{$Ym?^*BG2_N#M9M zYSbSgqv?;3znqM%KSD+`6ZtY((6!P^gp8&?LVlavJ1RIr{?_NWxf7cH)@N+;Z7n7X zew&{|)9~H;G@5K9OcrL#0i%*YD#FNP_FsamiGZIe_uJ);rng22ZzZ*4|@QdKso`*@co*F;4oR}XAgiANM|4!zF(80qJ8ZH zhsv*cmc#dJa&EHE)Kk;WD?CmhosDGpeoa2qY9DOHq25`Sn2lWlS|A-|=j9fwkBay0ReL&l~ZhpeW*uW%&sk3*+}=GF@R zA@ndvd!N8@(Avak+FB8X7Hx>Fz&|?}OgIT*NV}!wUSD+6byf@3;}J=%4szH z<+Kr^4+*58avDv4IsN^UIr+(iRdpC_?f_$Y`?kCIUDB>`sJ?rawad z*&%g=Z2vSC-4TrE38X$q{{CrfwgHF9!lMXHj+qX$CTAqW_t#1eI7}A2Jv#v+zjS5z ze$8BPm@N3qSp|mS`!!ozC!7jR|2n~x)4xvWVT}VPkl2gOI>K+$zfSPi=f%+UuM><- z3TT>jgkRIYPVj3^fu?_*V7z6eOU2`;WgFuDmxk}R>0c-K zTf+6wH0ubzrhlE_*Sr~;{&j-!wzYM_0%-cz2}YBnqFD#v0PujP)CrvP3c&FF-m=d# zS@5@^+rcn=zb1D$VY1+F@%Mva_v1!Nn zRGMsg{xO~_bT_t>a7Ngj*cwe6TdUdMWT0yzf#aaq8ciEpzh=7F8ciEpzb5Il8FZJ& zXxiBNHA$yt2aK8i*cwe6TfZihv}RCjc_re;mXd_siLKGJu{C<`c$==>8ciEpzh=7F z8coKK$wCi%0GvQ-i)8pXk}FrEX=4ik4YnolB!N_h^Jnp~Io%V{)O1}0lh+ipS9nuWq|Sx(y$tfs9`s~I$c8Jo73 zSC*Inl?hI zG&{p?aD;5nPNi84P5;`&*t9*{Y6jJczi0FPRkv1fqM<@?x>_-swpK);MY|39?aFA{ zTCtiBl$#^c6G;4yACJAQ&uH3O(MeHb)xDwA8e<5l1>mn0 zW7F1(Rj~b&=Lsav_WoKK1zOA4TFrE^HJbj|?#>-iqnRqUa7cU0a{6OyG#NJ&JIcEK zlg9}pj_-!=u4;^?Keqn6AM9oR*cwfLY)^uug#->b4h6^7wspD-&Z`Y z`0(QGT_5W@tLwn7IbDC-Wl@()x|DbMOVRS8sYU&ZzU;iV^Zd@kI(O;3xzi6iP3Uw~ zr%yWmqGO`tX&nnXzT9DPhs!(k=)H=*A8X&-?!k7o?T%@;qwUje z=d?YuZDHG23zig&Dd<)3LH?@z>+<9I+4<}9?#LUFcR=2j+=p}Pa*xa1ne$A}yqt4# zI_JF6rm@ZVHfs*(-R2+JtFv#&9+aJzy&>z)tdUs$MfL*eIEuTg~zQ`AdJ8 zIO3QXG{({2t8fa?{>Am-e)^LfFMJw?L%gUMWUCHakWWWqT-fV?7@{Ae)wsbKPZ!Q>Bv$sYxiIXb{WJ!o+# zkSe!x)BTv6YibO5OSij?VGQs{Tb zr>`ey?Lgf_)i^MxsT!n-Y7%gu*dY+BK~5AIt!jgX4pig8nxgXy%;iAQzao{HvKEm@ z#2FDCi9->jYjjD{mZ&=dRg>DuK3FoEGSu!~(GT?~q^YMPJYtg&gvoFsMSUF!(W?=u zQBs_V@HS=r9|B>nhS>sAR!?_bgELdLp~IZYt;Z4bsSB>bL$u&z7)(>rJK;?p+gLw2W@%kagkNr>St>BjoDK5y;w0)ffG5FB_r znQc4C?U^5lH@zgeg{5vQK^4eu#7bx_KD>Dqr-L`*l0n^=iN80t!7mm!W?-;rir~8S z#>|fB{B3Z@sVP#1(}DwVns+!ExFdgKA(n2Mi%?@P(!R*W#v%A3gc5cD3zpy-(aobg z;Bv{{7=a+xCP5NMwwed;i}13X5S&M{1f1@n9`#+FFOx4PT6Zlr+1l~bob8Xl^v5Rm zV#xZ%5pDm1tpMwVT>%{`gyfZwLNo$Lc~;)sVVEU5T(lC0KhC?P-OwCiT>6 zoN<=8HoxEs4&d#nMN63yurs4zq*_g6+4V7Rvcj!K($Y7u+oP z6Tvy+N2%Zn!Gi>k5L_!bA$XDCWr7QJ^liNHNiwuXmqvP`sz(xy-Y2ShCDDxB;YlPL|WYj0vEP4WLa(qM7_^lW4~0>jG%A185Hf&>jk) ztq7p;*HJgl#_m%NjpaAA_Z%AiHM9>MT0CxP+Z~!K_fY`tW6<2Oz-Whm!w7^C2qO?i zAdJ9&8iDPFzb&jRIzDf4&bKqK%Iw&oUxza?56#TV{By=d9j@whPluh6YV-U5P5J^2 z=Ik|3S53IP{RxHkLbw22-jBo66Aldd-lE5ylN1LP$g@b+Nm^t?IZ^*C^O0+d@i@qr z5p@^tI!wdAI(4Et8vp9`eTW);hpJv31w0Xyskon1k2D^VN8x-5=trvy)Ol*C#=Pfp zjh3uY1GV&3`aaCjYB0{I&3iI%E2Ba z?tVCsE^3eN1^3Q@S$ofFEZpER@7mQPqUY&5TfE8KIjPe;e&MX`l+1$*slSg_Mj`I``b<~s|M?mgJGnOhjY69z>P?}~ zDJQmbhQ(&?Sh0@_om@ME^@KSE{m&lh8saYj7Sh$wlV7Q`X5_m9&583lXPmJ~vyFD0 z>kbR)Tz~3o;Q9q91gFmFD2{gCyI4xsNS^;1I6ny8oa?QrsE0aT8=U`jG57isNh{mE)l3)f z+VJb(_U^4}x_H-&>D>P1UWj(`(BoYs9G$f8-n}IQTUrx`+8B9Tr}@k+QqwW zOy}a>Sd}NcksRS$|P@+2m-juHa8r%A(hFC4y3VZLcFPEzU zxRAdKK>jm;rmT7GhkV%(D}SpYHZe(VzM2o9+*<(RtvefHBOo_EN$xgv8-V;j0?HE$ zV)H(4h%JQN*d)0o)dZm2cL7R0_gvzK4Y75QyB0LpztL(m0II4VVDYe9V}*lmja8g? zYwQ}48+!5zH7@UM^){e4c&h-{W=v5zkQsqA-6J<5Z;e_5SpK_)*k1v>4q#phq-h?x zQ}br3nSgCCHN=htfTft%hCepM_*NtRquo>UwyLdwO62zxfO5^RHN-YRc9KW#?A-Iz zc>tCp6F|9TklBG$>yaCpdzd;5PTvE1#^?EuE*0l=0g8)8EcOLfYvv9Tg& z+ROiE?_1#PD5~`P&hyTDCi9*oWP(uw1`Hu$kc1>AA%yS$8gznOhUpBHPLAN8?ApxD^A0#|qc(NTd zpBLKI3A!oK6bX_Pt&mWha#RGGrz9Sopu0G_SOV_He@_DFK{IpNWg|x>=yr*Ak%0Uy z5-u&A)()C=5)V(%t%_DjfahtHfVnGZ7VUr8$f^Y0SE8>-K)KgQSapPy`RullYr!*N z&o@RlN)WQ>&l2!E`a03`lFLT0TOWE}_tu-EwRNwJUMu0W<1QOHQ^FDnJGO5dIZw(h z?`kgh%il%6lK?(nlz`vpNRdx|79B0^;)HAN+?F_pjjb*W6&6YQGe6%p@1`tiiR?&w^0WNC=KUWue6NyU z*sjv!x8&g6bR6g5x*WoLa`2Ev$xwF$Ja37>GwI`y<*3U>ej))hL!zIe;8xweZR8d? zhkl-0eyePX{hqO}Ed4AJJg`~@`jebWDF0siZ;Q;S{PXoQL&_=%KChmN%lifH9>M#1 zb@h{njrAjTbM48Ok6OJpI9*(Vi00bC;wv8zkH#zGSw!6p`nZIw^1%V=_ z=&usycd$PIe^cE}k?dNF->iE7KVC8NNeMR}EPM{RYy^*tSbTrfFTusnljnvT%Fpo& zX>|RSSBxx@(0%A-Be&mp*$6H*E&eAFY;r98(s#=kDj`}8-zjZ!!sR2QpFgDmzSj@1 z^I1YSTk@3V=Km+-(L>utK3w1vu+Mef8Z|f0jAlwm*rTJn1AWHc`CBD)|GTt}jM;yb zJov61XWbh8>)_rI#v|~BZ#DMn@b%cFPBEr|=ObU=Hu7`H1z*bhvglcum{iyhnA8i}?MuIQL=W6*vhqsHZUixp_MrM@xKK-#< zqLxB`9qjF?pM5~KAu?>e`ic>mVn%lzd)dh2a8J_C`c~jFNp$~Z+eYSyZNLt}6MbR2 zWJ15_2Ol5#X7o)7GbY)7ki`r4m4tmNTrZ(p#=6N%NsX0yubeGx@C3mEBrZHC)?;n zv^sT5$Cl-+E5EJdPt*346!P}4w712qlQG*Ht(O#?Lz)HG1jKurTR4b(JH(?CrF zH4W4>P}4w712qlQG*Ht(O#^?g8u-uuyvN-Cm-@*|QSd&oLbSKMxfQ?Xn)j;QRe$tk zd@2w3|KB73iQ{KWRu@K=MM~E8m4jK(5Ik-|H^W|+u z-7ZqT{1+i=z#C9Bl;lA65R~(MB;N0WsA0Q#iviC{^7H%)n(rfrBo|SGFYQMpgZVyk zSaJ|GJT3|@8ZFBE$|Uh`QYQ0#Bwm-|zB1);K`9d4o)aYVEfQ}NGOy<`CCuFibn`4WHk9{Bn%EQ4~cJu(J1|T;>|{gc}Q3u-+p9~D<#e9_9(n7LqdpdiB#PxGDNpT zs&0McSh^)rb?YOMUXs`$ZxO?>t6L&fw>}c-C5b&zXG*t3s&0LxfDAHAw}(ic)h#Fy zLUc={>XtaZ6$!^<*)5T(TOT==Zi$56s5@e3C=2;5NzAfaB2~8vP)ophNg{l!Z@0%v zn$^&Wa)zKtt!G1-#%)g`RYN`!=_QFpDG|qMq-w}VBE2NBUHUeT)5r!%LsaDBi>AdM ztR(4pdm{2((vFt%(`BNi5f$m$tt1<} zMZSx~yJ@Z6ZZWx5+Ohg4k!rVRdq||0BxdzbBI_j=QOmqdAg(23*)5Ts-Zk2_RwZ)NPBi3a!8Q=+=OLn&sJnstN1+|Z{)JAA}1!O2OFzZh}2e5q_(HF z3Pu$iyM2X7Z52gsALS9!OA_&RT^y&8+A1bf{^6UQMKpzkl0*tDkf9@ZP$Zn z(X^5r;|joU6-ukEq5!QY&Px(8+WW1tR?^bCRpeN@CDPZexdPZBuZWaTl8Eus*DaBG zx>Y3V>FbtA=#9Dqt@U6yE=h!cXTJ5fMEbfle#mJR^fF(!MEbg2Ae0(PasWS+ty{Ht zrQW`S_O0i*y7DcaW$IX_l)khW1^uy%NFB=*>Dv&l%Ru8=-#R&~&JtD_B*sTX4cb3( zUXu73iOjdHa=4^bS0<6Z^{L$=y(BSfL?Y6+K1B-1AhY}}k+3X84Y#rh%xOvf!q;Gvh`qt+oX9?1`zM~|qy7nZ} zZ_md|D1+DYa%lXm?@frzYfq#D2}{7SYw<*)t=L{BJHDdBSxF)+f%&#QkCwFR>Pe(u zPql=x?3PHso@TA)o@kl~WTb_^_3KF_>cDz{Hi~BO$NVqJ|NMH6XSc9E-)>o^Z?}(& z1nygz;p2U~Jw~{tb*t7l)`&!8o^FM$(GcqC+YphyZnpzsf?O0z$kOd9Nl#0=9j0Y+ zv{hbs0g}7cN2D*UKYl_(zO+R8(mpPqbywY%q$G?hz9kUpTY_32IZRA zbq)!8kPzTMu+N*Nn03Gb}ACXv3~`mHia(0Qic@mEjmxs1LZ{M4v7uvoQ zeMy3x#-Xt=R5!1X{MN_)f`e4QmGF=pZ<2Vl@Il(WfB9JSA9c%`mPvp{yCodjG7ybE ze7h<07@?aX=_s$Ro!?`4`bW2qTr52PAmRGDzEpWa9^u;yz-pE$QN|k*^}WY@$83Y7U;k5LKPL4hhva{J=d36+-4Y?g+6157BYbD?{7L`G)3`nrAitq3QEY7d9)`DnbGs>?%TW1>7L(R*L`2t=)hzBxAbr6pV$9<-@Sd8 z_f47ni;~Q`72+&J_I>qOV4;k>sa4pO`vVekI9_CClWXD94*Q%tpIB z`0TTCI%Y6mBn1PFVhkn?ZUV(39cgf$N~38Ql=IRQ4=m_RJ<7kD1{&azhcw(;@%bT5 zRE=TDgw<`F!7DX~2P( z)))Lhbn^6YRd@Ry{MIBT=P1AIg zdt8~u)eF*qaj{4PPRmg&bfD>)2E8L)%LNvG66tOl=154_v^8?9a^M&Ikfvp7+VL55 znx?eCB2CX-EYe(=L8m%F9^m#KlmygWWl-8tuLP= zP3bhvwHKrTgXq%XT9ig$ou;{TS`U{_(_A{gZu93||7Kt`3hx0oO|eMBF`|~? zrnz)l50_5UTsp0XOQ&froz}yp(=?aPuiM#cu6heF8c{b*Lph2?8jcaQ3{68hE}hoH zr9+x)FTjF7Xk4uFa?^kVUei8Vy7&T>SIa;e@?CzKrs=2~(o_!R=U&gaX}&D(^^8kb zK91$XqOUI>(m;o(G9R5mhqSTi%4H3JPIcm@X}QQleL<(~=%%4=IM=jePO9176F5%#VNcytn%0BF!%sX<7&6hcv%jr1|CUSC&D`LAglt z%Rri6#=;CN(tIq^d@OIDTfL&(DH;5b27Ztaze~ov**$GO$QfdGQOGkp`@*t5=rKRX3nR znvb27L5DP7K9^3*MVj!9X;B8!w7)4`f0@RW1!<63y(}p>xx; z42%chw@7{!tFj5hDfaY@t*_L&;TN)e?6T)m zX@}3>{2HI`-iuf7S8(on9JjWT||&(!_$=#UOtrPF%2Y03+EphMl-Bm%2C zKs|gc#%|S>>Huk~d&MG6_$Jy7X| zx_#uS^-X?S|2`{=e%d?VwpXj4_Lpx?Zuiqpoz&3jr~TyEC%gQ#LqGCBkDvCH-`v&f zr|mU&d%vHy{epK5`e}n-JA2qqyR734=3U^Lj{5%fsQstvIew9L`akb6%}@K-S9c!u z(}vpGcJ|XQKjM!s^V6QY?#D0p)6gE;=Gt!1skWus-+YHo+YM<-r&y$^y=a@`-iel> zSiQ#rc@#S*gAO+C`x2z7J*!P3P0PSo0{tOP<-@pv{AfqVT^%=fT+>nNIIUxK$I_13 z9aB1r9Z$DE(tdyY=i5KpepUMg?VH+| z;B&oC^ghsgOYgjLpyi&H_LgUgj}~_n?<(G0yrx(x zo>p94Tw0u6oKh?npKgAndF$}~&7W_+boisqS2eHdpWi>Tzpp>)f3oj_=FzE}n&(bE zviX3ii{w80P;*1`Q%w&y-Pd$S(+y4An$Bz5&~(+n1p}J~9`3)d|KXAL-ls+yCXe>6 zYMR?SziDXlGm~aEJu{`RDQem@`N_tI8t-kqz47|SOB=T~u4}w_>Oqb38fP?iH$KL0Ctdf<_P z`v*Qh@X>*5r`|Dg%hVn9_e{O3{(-4C*I!fr&~T~#wEETc*AFkPzkPUi{gnD*{nK^# z4nI2o;J9q_ki9T3fl_j6*d%B4=x>?GB{gy46G{5FU&0T$=0kV zqicsQ9@;##X6T{l-stw|`e+ZWW+8V9n`~Tlwh~6X?Qiygp&)OBD zS4J?QpZ9*V?bRloruqdrhDmC;_M{*Gw;t#H&K91_OePF|9%iJv^#TdTGEFxA$(GDg zA=)Q;W3)lGjVlnn3R^IZPsNU0n6^2`uL%S$h|Z9GSEolC9WZDge;h=@Mz_A3j%tAT zNAO~KByOXC&x+2GM;2}AkdO>Sf|voMi31rdi`EN^QzgDp7vBK{i%nr4B8*98mYUojdq+LJ>wv%oKdR^l{aagu0atNf}eaSwzVpD{xY zgwzBmL64b2Cbj_yL<0u3{0dRqMybF#Quc{*v{rs;31kG(gBUF~`aeM`akd4$aAI_(usEaKn7Hp#fgTn|o1`tykSd%e%pe6BKp#PhTrAKx3X79tJ&*zP zFnhKUg{@ic9Fn4eEwNmHXGlb2LK|n64U24`jf*alf5iwR7Hd{CNBWO!mY8-yMbJKP za;gHuzV%l52O~v*JbG*r%H3;O%;G$e0$EExnV z6wc;EF>|X~l$(!AbH9`+#wg1(YAeBHc&GpjjB)cANZzR`G}>)PiFhXcY@Z z{H?~UXxxOueiE(*t(#?3%cNJNT@9JE2qvf!%S;bN|AZcrW`!%ZASS2?oW436%76=u zAZu7&mf;*}hb_imYninZYL6A#f!TRH+qWK_^JH@~So{jDo7RObiiIsf`l-iearKsA4NpOp?_a7DkEb zl~HuU;Zf0x%hj?oM0SUfn1Q&uv1W+qSybm0PmatLi(1xR8mZS0uABD0lPs9n3bGYrjTRN!<-u+*_OTamaxu_O*AMq;U+#L>cz+3W>8tqx0my`!^cR zkM=WpNvoM7X<02iDi@KXxus%uy;G=yH7S6X$JoL?HfLSAXrv{km1 z!UOGTYL;KOJ;fuuxFyammzh_;S4)0%UMOFqu$8guI9p15aa)lk=9gK0zsqk+T4{cn z$ls?*?~|un*iT+d!qe>~)|01Mc%rOcih0YfGG!6g9Dj%H_`5J;+&)Xz&`ywXjw2mr zF&x3o+y`^aDHcCn@H*=58a2+YLm8l%YH7Y~%E%tcF<(1ZMqKz;_*IP7bHrlj%EMgn zqkBo6aqN59G=*FD{5i#O;?3O>IiJ+|ojjKc`7xPx=69cINb|#W*cmc|)p_1bGj^?) zbId}|bmk?LeXMx}X2O{1s!h1_iUpz%Xy5h5)%XvLE_vm+qpQxqXU5cPrJh`%_D3j4 z1^IT7TEk*6gSK;cEiD9(IVffan0=25C(O2S6@VEf=HZ;}sb2E@Y*I_r%?r?ul}P?S zU-Psltgg*;C4t&KT`bVHU1d5r(JUF`+DRp;M1$xvu&^!C3-s#CT7Yu$Z2&V8?HkE< zuXfIzZEN}S;A&^w+2!P4LyR?Jpl2_r&vLHEt~5S3c|GR)EIS{^qS;pIb7vVZX47%q zJX5^!sI1g-cAnoJlm-9IH~}B(T<2xUlOAWNo3q86oFVp@e=UDp?2~w94==I7+&1C0 zC;cg{$&tqy_m0WX&pE~l)tYC@IP_}y+f{UMoaCG>8ah+1ZZR?*FR3!3s@_NJSohbA zwScU8W{rlG^*W50>NU0BRmS1P^j*-0J4T%$`oat%x$dFX6EY^?4%QpxzRlTEORVAW z8Vrl?Z1q7Ab0b7GwDk7Q_JtP7nXV;I(!U{y(ete?&k zc8&f;+kUcb`$NU1w4}47G+4^Uj2;EfHlMZ>_Zeqyb$o`6>U`rY(Zb0hFXtWEK4q@4 zQe&ysR-Jj-i^o6bJr7f-Ufi}%+cT}VwVu*Cz4gJCD_ag~X>7Ttcvf+@;?J6|Z9b;C zyZL*v_hETcvFRI)7dI|xtZV#I!1Mzia)Ybswoawr+ae!-WqN))WQ{ z4@Mt|*2VY#H;a$K{r}gR-;>cLqi;8C9Kkl3f<&xn|3(gWlV1&g`~7!r(&M~etVCnW z3-1aBEgvtD_CSwRuVq=_)>P2y{1P!4m@k*)xH3;ED!4s$y0Jj*C1kRPsR|SlR26$C zoIuRxtJumwFoprMY`zso67ZwPCZT+L{%QumK|hUT}o~J@A!u=2ZT%DhtGnI0{-Ygbr%^#iB&JvcyJfOu)RU*e}ddX)O|)|QMKnGJn4C4Hez}K+-MxsUF-4+ERkUJoxs{B zdm-V$yJ;4R%XCK?!qJVY?8Ib%jua$*vJ(@Gt`h|IJ2BzG`)9`L#AJmI6lA{XL6Z!E zJ5Sc+5p&q81`z^-d%!~J0a$KR2S#{m5D7D1f?@krDvk_b|3M7$6&E~^EHf9BaOT+O zpqsHMNAQ5MAkmEo4({5hd&S0P1klvF&@L~xNOTf1Fm~ay;wis{fgI&f! zFTZrQj-85@L8s6e2Hj!{cxnZuV9h9Xo3wp5_lw!HqA!e|f%%vc%=eYPoIeJ3bxN^7*CJBSUX$Y<$&NH3)3>kK8 zReFU*kWW}F4S9wzKqa^{o|V9k+8_q#lhlP8Hl&y>@Cy7P=G1(Wg)4`Iqx}+k08cn7 z8`vJ0Jz!B<=aPiO{(|fw`6v{@6Bu;K06sD3GI(+MGMLM+R(Y^~v+%a4eDwx(=&>A1 zVC}Ij`dl$-JZ5p0{0ECynf&0TS6}~xqrfT@NHDZtRpSvp0sWJ~1oXdqWy-UIIe}1H z&``2mTK+6CT&(Bd4v?BJ*+79oZ1}Vgx4&|GGc15ipvE93>1# zXoZ*;@U|dI-$!5-^na^D0*&Q84i=(?u?CbSqBtngz4Rap)BC}qBoQo-fMXjd_(J3R z@W>ZOB*LM%pb=?_45ru!?yjbg1yq;l0qBn4YXc=n>OPXL3>D(ND*Uup(A;Q+NWfd4 zYrSP*GU^g$L5vQT3Y{T)PH}0DCkfWd|2IZ&E)V!*CUWyhHXI;8xq568%D!otu;Jz5 zT4^IZc!a9qwJ)@eAc>ZUQ-hMR6IS~OS-?($RLsYYP7@8`7QfF1(g(3Q)My14>s)>1 z?h&6I+Bk^alJcf?C>Tn&x(T+OuL1anpr&1E zrXR42^QBd=ylo#Kr8JmX2eBI4ZpjRDZ1V)B+G=HX%c)WDsA|0$fvNEnrDx4AlM@nx zK^r(Bt^d@zrnRT_`z`NnIkKg{<-y_yipLfQiw`ybQ}ep!$;}Tny}#+8rVja%z?F@w z8haZbXt++^L@=%4k@}nJH`Sjwu=Bvr`#;*hvHunQHx8aKxbxtD4Sa0i!meHFe_gj- z-Yqb#?iYm*%Uc3oS@_k^%|j;+O&R*-;A7E8qIFRL_7lJVA1@3=s56TjP0^pGVXXw# zfqNJ~lY;^I)zEQe*A;r4|NDmgEH9@Z+fz~68B$K6{3Qa9By~D(S}LiQP}4w712qlQ zG*Ht(O#?Lz)HG1jKurTR4b(JH(?CrFH4W4>P}4w712qlQG*Ht(O#?Lz)HG1jKurTR z4b(JH)4=~34LlxwF}fS~{|mCUr>-C`=fFL8?s6+cOU?8DZ|E4Agq<3=|Bv0bGv&a1 zUqp@(9v%GC9X!hakNrOfnrv_h+U?;#_e^;3zNm$=p$RXS)NNISW3Nfj4j^pr0zCN) zG?`Se3yM#IrR50T1;y9a=F5T|Q9%_-ZpA};tejYT5MFhA5I({7Ad?BT2U)xb?LkHp zXpciC)*gfhw};)rMPP7CU`Mt4UI4<;20`y(ULbq&&W?K}!NJ;38}Z?>(t>&c-U!0S z-0>anS8c?0S`vR9Lv8(Dz~ zD=~O;rQQ1K?w_R;*kT#9sSytqVqf*?(js`x3p^581aGm_XCp0xql|(u!~|IbJ~V>O zgnR`tje@y)fAz`=g=kRdE#z3-%puzt>|!Q8ov37I+`JaDq`>;;9~EOVCOjsMv+3rR+DN z2#-y%2vd}Y4uGs?nKCEy-Y@(PceR zK^Cx@psAO>m|qH~Z1NST0nS@RTSiYm$|oVvs>(m&^l*Dcm&4E&?aO-{W0t9eUt)^bO*7>ei755M$jrOo1Q@Lz zn}o6wVYJ$Ogr=Ma$U~Zsa8L%Bt!p@h!s3He=4%}iiioTqbe1h{@|y63GRhr~#i^Oz zoiH~VOY*58f+sK*k^#DCqN||bEa7n_;=gEe^-ceN4o9IXXWwK1Qwd_QOgby3b+~x2 zPr8x`w3cXfs3zsC#A_ZV4{P%6uDHO)bGP`u28MYIW*QRum&5|PCQE{Lf<_WP(57Fe zIm--^oQ|{O8M|S!#pCzNMA(YYc}{L9k}8} zwbGx~q-^NsL7fKQct|qB6#=@Deu2-*xL%l6(3y1UHTfDkGC_w5lFwiMB^+HTs6V>P zu32)RrvzPU;93DM1H)+SUanFe^oRr-)GurHx6)z5S5#u<JyTgH)rcZ6FcWLM-Bqu$vo1!Ln=6N{W~Ssm z=)VqJ%(xfC<_KwEJT#5VK{#DZf6yIVmR#RLcMr1R+G1rPN;fZ+80_$Cia`n>;E04o^WXMxDnw&<{s%nds)ht$iwEKkaow|S0_0L@= zcD`nx{BHBRn-6PlZ~nKYPj{TzG1~FH z_DkB|-n6jk*~Tw4mKyhIe5T>E4GY_!Z~JoF1#OGlo^Ab7>xHfV(Q|#z@jW~D{Hl9v z!)qFzssGpdQvJgEKh=Gv?u@!u)jd_Xt#DG|Wrd$cABxt={eNj;x&P1m{JYDCU@#4t zZ|?v9p(~oUk2#N`QTe@DV)^P{j-u%Hofe&H4#xNggW_8Sf=9o7Wmc{eXF}_wfS`dB zOFmc(}Ynr z%(;?pN+J_XXoK2ZU$%s67_92sieMreB*y}Ip%AC~7Mxse8>14uT0twEj!~a3|(ku<{x&Vp~og6zTdC! zxwaC-V>3W%jae1R{t6H!z!)85m3X`G+0K`U)*11tFew5dXB8$zFia}Qkt`Qis*@VG zN0LpjK`n9EsCy@ixKsCuNC>Ex9-D-?0o^(II+Hbl4owCynjjnW?`pw_$O1+b#3I{_ z$>gQD*m#0ej6N#JQv4x@aI|L7xQSI||FbV-0b31X;cqM@95!nENqG)EzUw78c&52LU0KMq03I}O;(u+dD=(0{33w2-xrFrfavciY)UB9t*-1%2X20FZf-zNtO$FU8BFNh8iIBuq*EeJ+e z4+1Zf?S5FGIZL+m@D8nyl3)eymQhvhKp#OuP4I;eMao^~GXodJI0OANf z-~P&3lc{Z8^KQv$(ILJ&Ax31m{05(u5R5*D_ukr6z$1Q?H60*-CSvIK%tP9LCD zOOy)H^5|f(1WcOIlv_-zpdrX+;&u7d;Y$Ztm!Ls@x$HC64HHX6DBQh+IAoKm739mR z)rx3|^egUuLKm_1BBS7XEt5U*R-#Okec5%hhFHUd>F0^I#N&tBkwtLr7E3EZF{j6^ zMF!ABkPORYtIFA?*|CWk^HM8CuxbvL1!Y$?RwA&7BRIeJmwh8l3KDOhxLyRJC+xhl z{DbpA0CPPy3FSHNGTFU~5ehp%XwWFVdDh=1JKd==pF%L2X8wHnSB!d%y+MK^i!T3X zUtB1T70ZbFu`0qrov3-9UtA(^w{2rB3WEaba{ku;np$;T2u5AZAaRv&*E>o$wt;n7 zBL01Y{9%_mh6-DLaD7%rt229Is$Rdj>)X>R=tTMbn~dT*Zjefi?K_W@+ToLfs2#z< zwL@ziBI744KhrfF-+1Trs_dRX*nPrm&_Y@6ZlOFWipAs8%RTwK2mkZSsw$U2l$*FD zM?%)h^8zUsKAQVr7QgS3msik+3!?qaq9wl#LvXO_b0-j=`RN(ER8{qt?{dtpl>U{k zlcjNf_`41q#6i7HatcZK z#KqY0p1o#KjG&q9N-=}HCu7J8{qd={%RgOuL`AYJ3jR}9ve6?6pLmU4_weLBUZfh4 zRn;{jeBw2_V@AX57pX>MRdtOBpID8=9K5T6C^~1CX+a}GQ^g_>FlkVxcsAs>PKX%{Vy-{`n z{IKhNU59mbc740^s?NhYJ3GJIaY4tcJDzI4wf(gASG7Ocw!Ljr+pF51YW+m(8Lhjv z{-Wi&mc!)>0S_0ilP?5JEk4kEUGp0GLcoJf|Jbyusjcb0#wFiK>lTkYj}JTy*DSJj(x%z62ihB~>j*5f0y!7?aTMS!0r2!Y2^s6$Hdh zeEVb>!6?8kGKhx2&A3JUnm~`3+yOxF1Qwyl0Lr!t_T|!{2phC?ca4`|j3Pnx&RW4D z3rsYFuAZ`1S;+zmq(LmQS6TNpHAPcbWjcgcVLAi`n~uMNNjQurum!Mp9#_Md(Q#xa zi(nHvRN!ZeE5lV4wzgw4!-;Z)#aZ-0vWpE0qUnv3tWK2t1`ok7C}WLi4h7@b2Av(~ z4P90R*Dn?H|7GP31!#!W`S?UMCGC0SI^-T2f99%JSvjI|;Wzk-VH zMs{eaAP2Bqx<8(BW4Dwq}arsT7d_5UzdD@3B&H}&A`vWC4pPqk3!x#uOwx@zClGx{no zjxI45)|e7lk4=RJ`=$R~-_%=VY7ZN$YSK!0@aSrCIYA;#JZ?hQxl7-;lF*G^U zNRhQr(?CrFH4W4>P}4w712qlQG*Ht(O#?Lz)HG1jKurTR4b(JHkp>z&@9Vg-V^v36 z$KCB`wa;$UxwjR;i)cWO?EiJpW+*{mO+^P8E<_|U>(cIAdm8SEW z_H6oXl&svJX-(W`orsc>wi>tUER@jy>&YZ?e{UvxBjq_g(rJtBTFQEYUA*WEwB1ce3Em3n<2#X2u0B9slHAZ zyJz`is@_i2=R?U5TM`nl!YX6wcjGpH(v*%2`_+=hT$diTYbuRoOKVdhO9TjcHro~GSw?rmhrh-wGPcxb$M zI~F^<6(Wco-??<6JWU67el=w~a~K=E{Pm4e)su2HHY}_XFKv_a%&ofzr&zhKsi%32 z2sUUFLz)@(IqPOUGMg;Sf^>CQN;2NF^0hW4lp&25y?`BRix`Q|Og8z3NrxTSc<39u zP;vhZyZF=Wb`o|$&45?bo+)fj6-M?e0n`}ok_TyQNzBBr)~K)uy48l4{8Nr|a!jljt7K*AR*f%GfolzNig-qBy~vjQ00Ef<-zr!veQuL5v2WuggWy~63o^jC zWnecciN^&uh-3rZaB@!xOU4cNAp1bOoSd)?GDzKGN2yu2_7;n&pPV871a7WV0^G!^ z;(iN!9f#Hlv_F|t(EfPO6CMuNZ82mJ-2MwigFTVU6SzCoP~ zFarv*$Aw}E?n?^@#}*2+`FgzfxZ|<-G#uL_f_yb@wR2jQoS#q%Y>fzFvqbzNzg}To zK3QN(M38H-M&HgWEMP`4whW z{7EYr22ZTVo3xT$@T59#(n>bLQ|YlLtz?A(CCFsc^USpAg5`@aX{BVCP6yfA_>)#L z#FRRS;n8wdBSzz*9<)oDiFmVp5NXVpBcx{w7 zGwm9U%1Z)Aqg`a!;R9^DNE-e|%|L{Gk)sm1$!t_;;Fvc`+Dysk4oUxmLo?;&aXOS7 zAI%cppuqk-d`W=s7iTHphaGz;@7&o@rUtAm!LH#r#?(#&1r!jxoPh%kMuk z!IzRYaS0q&&aC@S^@nE61Y8Srt~DdpPui@L$AOi zv9u8Ff#{V$*}ew*vAJ%qx$?>@VJn!YRoQlRig((slD5BI@h?(anLdg7IBivpE#aXj z{F$}~zc$)p8) zc&W)gM`rC=BkTTZ@BJ@bo0$`h(^m&x%CcwoRq3Ul!_r4oYM6_kRQN&H)m?{nwRU}} z^Nh}^ojW?-(J`;%_w6^fA13ek|5V#aZT)RKTHn>We`|B=eJ$^7S=!Rva!>Is#n%@9 z+Wf`lvzzBN|GDYTrn8&oHT|{mi;ZVD?$r2`h7UFz)zH-Nh5AkPlk2}z_l~;xb^l$s zzObV3T=c1EUHtt2x&khrcQ^CYg3P3Gk+*Qlt@U{1RI;M?$iESZhvB3gUVr3<)Acy- z7mNJ-!W4i(>+{J+ODqH2<_Ka?`=%OOgSXvk-&B*{R*3!{zNr>P(`%uoftm(t8mMWY zrh%FUY8t3%pr(PE25K6pX`rTong(hbsA-_4ftm(t8mMWYrh%FUY8t3%pr(PE25K6B z1`e-pslT)C^t#r%+vE!Xk3}DL?*H#2w~TTBA1~%CME&Oe{~w3{Jh;G|^Zx&7a{NJw zCmt>TBz%1B33GUq{~x#S*PHC%rxf{3bo-DY;dn+d=;&`MBi{Bi(UttAl426KqgFvsD7WCh-1y?MsH(`H}rduKSq5e6f_HzxgvEh9-la zT++_~ZHz29_*vG)@(Cq;yJ)>w$`*$~@YAfz%oprX1^v#Ol>${xJU0k)N$Egps^1er zK0t^@n8Mz734MwW5>k9h1^L+33VA#PA6LXfFMB#Hpv{CRVJzl2ETGc~eUJx=IqSlY z$^$CF72>zpEHJnlho+h(sTIl*Y$o~as3EcoHX8Tio2XpfXU`UupmIjR_sM~NHVnr$ z=ri<(NE73Q5*8e{PNm;fvn*1rl4q_V-&HfBZT;KvB3E#uWq(%<0+LZ&#|@$pRS=GC zPz4<+%E5QlEI7D!{&&?NKEQ~E-($=67tN&jAt9?%S{o)Xr4I1T0=nN-Lp@f%dk=Xo zy^3-PM7cpNAQ_H?FD(FJ;etJ zS(>vd|Ij4|m3akuKl|;+p6||;I;Tp^l)O}kY>5OyUlo4I4fU*~RA=0Xb%nZOcJhwF zsiK!Eq$d#4SNsV$$X`jhIr7V9@ZF=k_U*~)V&iL{K*&Ggp^B{Fb1MFJ98^(B6>?Nz znsSee|B^Lgj;{&=Uldi4Rn@AfqzYrH;)eTwF7MW;!m0^;QB*-zRjZ)PCok<)2jA1OWAzDO5-HCw@nN^+(~5Dm||;k{?ip_+$Vn zs+j)~jAp3#8^N~hFyW;M#`;FEaotz%`EVsePyU>bjH*-$!BC3PXf>1KN-83X37QmR zY-@P)y_Gn0T%p>J{G!Fk0E!8k)8uQIjAA9B|A)`2E2&1=ZrqAMd>9>~nP;B!)myTh zJMzcw!UU$&0lry4e^&iO>wB|2>GsqMa5)M|v|*mhu+vKdQ?<<# zH#r@zq|`ij3+cc7#cve~M*4)mg36PDUUOlzNQ{_QtQL+sBsymjiZgY(i!#0i{->Yb zT}K%b8q8y|Qe;>nOFdYr!CMq`wFdJ1=*%md$m)+$E$1u2i#%>to+E^fKFrQL5SHa4ye2n zSs?gTxWZ_`sAry{|sIXF5tQ57sMpPsFvFWq%ab;Bls&~247Uubvt#zo>kz@$PqV8Ljb zswS>1J6NYPG-#BuYs3{SF5lGqKm8{wxP!Y6J~?pP;2r~~4t%=* zZT*Y-|JrwZ->H4G`c~8x>%LrgbKzBmC+z$G-(HB;i}%6(|8?efvbq0%=+O6y_^vJ- z)7A2?ReT!WGqT|r`6uBWt3LZ79_9bXgr(!D`XkB3c*qSxJ=Vphdy5S4*X(ut0abZt z3$EHbTNY44!btMwTS49#d_Vq{Wd~L;#mV+!mQh^C@$|bO(pzK}99+9GZ;^rD9Q z`z|SdNWe_W1`da|OA&}+GofYxvViWzJj#7n`@kVpl}jMXt>R+-g(IIoG^5l^+bHS1 zB8W?1sJu0C5DLH~rINhh<2gCxmUQU;fv3j>rIJ3XrHafv9$c zx5yxFC8ds4?W6Yi+)-6YPaveP_!b%DucX`@`OP}(yAS__?7#|Z{)F}kg#1B{cx9A* z2LN>;EBKs>Z;@GeSQT&$Ji@X7L2M?b&1NdgAIJ#OVpn~ew?&! zm31K)b*cIil`Mkm6Eq2enlISBSf1Pkt;a2Q7DtxKS__s(EF07?F?oQzS(AtCxs+uT zT+e`&tlysf)QSqGd08u2WD#7u^hy>PKoddgSr%ojWRXd*YARUCT6gzDD>GbIUhCOg zA_SsWOkgGJ`%PatxazJ&aMf;t@L-*e>n4^S`f-_$R_P`Po{*a$i{SbMyNNsB|Bo_L zMZJOyIKO|BQC!Cj!coTr9NVCGFZ5ao&Vk_I+KqXw1b#CgIX`O}J-*!&m{JF%&vJL} zwGztx;LP<|6X5a7B@pFSc&&s|+uwAcEF7eS&MVbk@>p=N>T|afUigJMudmA0JXM%{ z9Hp=D$_3IBJaOr-SpJPlMoZn!$uW}P3Purse>@pfFp3;3BecIio=hrM1uiWCLNp`( z-gkVYk})G|e>_IaNIiMT>vaI&rjfKp>t)U0B%oO34$xIuiR`v{JVIwNI@&oJ#oJ@5CI&tB1Yi4*3a&5`w_lN+6S}lt5_3N`Sxs zA)0o0&9n1l6&Yq8w0MzJ0>LSx2JfuSwcI>If``7)l)Oa^U6Rej>+#Bz=f@_z)>LG(*qs_kRA(LR$RB+Yv zt{?oqx~T|(u%0Tfda!afftxbu2^Y-EE5sa2KU3olkwo4+D;MR5hGNHk3 zs(u*)1B7T?((g+TlxMU-t~KeB2nNp}aJCZ2q$(v4I&meO_|3b-jAKjKAQc+>ic0qb z!i)$`^>HW|m9l}CV|jj=Y$jG0bc(;jTa9L!{O{scqjo*>i`J^$YLxyFPbLp6zR-MG zabfe*O&2!LZTeN?Sxvh(ZfaZ?o!W47!(ZyR)_&-93eK3x6v-EcgGX z6|n0ysw>E+$KcoGS$#P#M9t>@|0kyYV+Y>{V4wfLTj+jOzW@K$Gp3{4j~UQTKmP0t z`Hm_I3Y-fhA7!>IP+Ao%=9s%?lp-E<#`9Bomuisa;OE=ruQ5=y$80mFDD zz&!0ifQSG3g~5!DmDvgj0SJt3Z-b~Xd=f%%sv8N9%x;u738_T*v6OJg(i?{>P(s$F z6InnV6S}@6o0MYm{7e4zWhGS-)r@m}2}`+W+vW1r-(XW+>D)J5VeT4oQ#Fj2te~tQ zx0j`FvItgG`cjn)f;(;YrD`QQ5iM76sXFI}TjYDjDQ)K&f?b;=5W1bfrRqng9w%Qi zPL-bL71G)zgV;NaH@GC7GQnuusx|^tBD^%pn0NSK_yZ>`nO=c1^7|wiRjCw$p_Hn3 z6jV|XQB2USLMZ6cPrmYH6(}hEkR=%e`-6N9lToas@dqXMUSlQIDBI1L4_Q9@r{0%m zsAc>vOkheK()5|5qkpgQw1v;TqN;KUM7b5-YlIQ}^qr5+%qTU_WmtzrV5+uxYD(Uu ztfW+FGo3_&xf`Kc22M7|^a&Wjp4szj;vgY((0W?ZzY!c;X*JJFlLe}f7(p|&9om)6 zwDQfjPG`Lmd{GdFN*lO3l;0CiF^u9mR@M^<4zAs}cl{s!>U*;sR9>yDZ4#KWO{gJD z9ez(dr0v4$JOF`J^h7heI^v{VDrm!Ghq}jrgH@l|p&-PZ>kp9+8m9P+uk!n^+bB;w zQ~})Y(SyY(p|dKs3lN+tHLpMAR{Qo@drzVe74KJu)(D@F7-pILSF3h&7Y4@beR(S{ z5Q(hNkt^PIY~d5CQ2~68`@p2~Rlae!6R8ndRb3;(Ctjm(|NPkjn#zQ0L{?STi13Nm zXyIx+L1m1`Zx$SshuSMpeJ=hAbvttM}Glzmrp|$}VLHMm>V&3EAsQWP$-F zXi#<+*$Ayz2@n_{MB`AJ54w1iN(fpfOU`!)2G1aHwi3vsDkTs)aV4C8&1pM3mN1?V zN-BY1C?U~^a-KPr$XoIvn~B%uHxC~$j*xigl?-` zWI_WizO!RDr#n^VSP4ecRJBG#c(6{#ydK2WZ|#N~?jS-Ff44W>P`RpaxLGhvw#vDH zWfJUBbS_|_!8V_HjRQWF+Dyi#|TI(No}pqvSfm= zoj>w_ku2~<(er{tzKdKWXI8h%ktrcWw~K_XVDtvvDKbR2M5=BTiO(V6uB$LJ8bUom zla>}bL{y}f3EGlGdF^ycw~HjLVDt*zD)KfFy(rT;gpx$D97B^XQ+2CIzf9SplB3&Z z$w5>k_R44|$$>0xnEZ5^Mae;wHzJteBjpxm`Gu+0;`zo6?JH$qbW!;L=_QF-eT7K0 zC87qcC(=q1+eN#~_si7w^pVrhgJyP5&ekeGgHCZwXoblgMiNCy{>tyhsa|-;%_v{z>F`{d0z({r*Yhc>Qyx zApQPHq~AY%X=e-4@1I2a{nNK0=-T#AIgwBl&vZ|Bw6h#8l~^#WUH1T@sLmtuO9D-U z&&lufnM8j722n~TG5JJS&Lr}CEr?Pw`5hEQ-M-*{Uj$K|PbAweBSbf(h~%C}gy@EX z&k2Jzq8n0zqhBDpVbQd>S(Zt9(iNclBRHH$-mQ=rPDb{M{p9kwaX=PYlli8q&T^?)8wR;H+NBso1QpydI&yNoZ!VGReYH5p7m$@l8K0*L{4#sNOIEk7)p~G zJ5~|_tsIod@dYGuT~96%T3%aUiBdATu1ATS;^dulp5VuqsZvC);JHMu;JHMu;7a6N zl^qu%6N$!=iA3YbM4~L29REZjSD7lfqbCx%eq4!CoLoPyL@7?LA6KFjC)bbX61jeS zTe^WMxa-H2C{{yOZ*W+_qCr&eaAvxowwA+*N@RIh@u?TC#z2iLz?v%%8|l*lP=vC&gjaZsj&=coMVlsl$eIpvfo%chJ@ z`Rn8dCx2@4w#g??e%<7$lb;#+!N?~^E*se}vT$T% zhi)Ev$Iu&w_8ICM`rY8S2DcBE29F!ud$32|b^ncl8wcJxuzFyxfzE+n_21k7q5e1b zAJsp*zpekVzOVFM-*;}`;eEUJ75jeKdw1^#dbjo-+PhnCWA7uAzBK85lioDxph>$- zs+;tap3nEZr{|2G6+JV0Ug-W&_h-AW>OQr5|L*DC&vpGr*QdMQ)wQW>N!MRGALzWT z^YYG(or^jrcmAp4dmXoQyt89{$AXTbjz6}4r~TvY7q_o%e{Fkz`%`WI-uAJ!x3#Tl zdrjMb#7}{>#tkB)^bD3TUw58*|Vj+oyB+~CuibOh)MY$%xv3uW*NWYsY66qz0xEqS&G}7;TibQ%z zBJPIbIF0l>q#}`ClGrCp*f>rjAv2-|MIx;vaYzr(q;PnS<3`%N#YENph+X$sRQzTgZbnkqwfAsKKo#(lDQ4zF$w@5*`;T)g2N*Vn2s(2`m$>%9aM5-OqvJl0;m4`j)^x zjNXK(L8Tq5ml5gfR*^_ANzCeHMCR!h=|E=nG9sZjL=9Rd(n=DudKrBUM91$)P+xQtRm>g;`XRm{m`f32CfEQRMIJfyE;~T~DEYa^}M5@2dLY4&e3W>hIB~tyZBC|Z0?{9~Mn{7`@ zWbIZmqmo3cJ=-coYJ2)f$N*$kdlISbsrxHj4FQ?eo2nSBTV$^cd-QlakP5L;_73iIzrG-u~E_1S^ zA?6|PD(9z>nBgNT($~<}%lT>KRLMb9q+ibm%lT;}JQSiL{i}{g%K2&JG|53!q%Z9g z<$Mnf5+9R2evB#rrgJ>@*HozBL@4#CitzgL{j}xkkZ0KtCt4UFLPy_ zZ_C6uQ(Z43GOw2*y(BT~Dw0UQmu1ar{9Z;RdJub&97yo%i56kLUr)c6`AGCnzn8I0 zznA$)JGR;~F)HTkRx*u-ASt|=>xYQU)2;fxta&_cvx)S5ygvuqO)$QXC(`%vK60)gIR^OFhn|b5 zVTK-*e=(LZ-$&||jskq$9wHf_N!Js;6H$XN?ctKae7{V+(#b=vkqpqJ%Y>gn)ZmwS zl4LO7FB5(YQG<`%EE&xAk!Tx44LfH_ogb zyr>#@vF`tWzvtSXH^}||Uw7Z$eNOlM?z-;#y58M&WYOv|(tsp{EA#9K2xgb%Vvh?+jcsaO}Y7z+?Tl z^l#~(*Z+Lqy?vMWt?C=-d${+;-c7yf`}%wIK0WD+lS-5JpVU5STfN;U@QSHVPWkkd z^QP=KrC|#93}oH^|B$o}?*A_}ze`PjyS?kauGg7!`}{vgST^M^ez4}(Jj(yi`~UE% z*0*3BLJ09KM5=F5r1tZ%d<&84TYRMYmaOOhiG<%k^pQv_Nz8iwpGfsBJ`(9b_Q*^Q z$F5f*QhkdeZkHMEEltr;$3VkCEcA-E}66-u|q9XGycIa^VW_wb#yLd3++Z zRTP;uPX>)EEs@$Piq!T5ZAl`oB7Bceq$ngpRHWLFBpGDZl|GT$Dla<@w6>l&E=iP; zFx4tVYO83O{+&s?=5I$+BDGZ%>DLpzDZ5pm0YpXm^~4Mi`Dxu^ltMgaHFDGS9FjET zr;&QCrDZNKRQy+xAIz!zYc1AOueDxr8L55b3`zE{wTRSftv9V8($~-|N%pU`c9k@1 zx6dA#M2=;*MAiuaQIT`Wz@(MrIBSK9NVQuOGquSjx~br+vV zwcEdy>*-rUr=WdrLZsTQB2`+HSCWXULf@MZsdlSK)sO%TGRtm>RJ&EAFDU+MYm` zB*F@O4H4;U$iJrv-O|3SZi!Tj7XlM}yA}G>h(x4Xd>NRyr&*H3EQ=>nEnbnXZjtsk z(U5QPM550lYVeWI36lAKJzE8Ws9}5TSD5lwK{DSWUnyDD*$|P{*btGv4Y~C!iBwrO zM5J#+J`%e1ZHP$UhO(^Bw;>|OvmscYKdT|qw;@+r0Yzv}-)j=-+mI_QkbM$;8zR!T zAs;y;NZ*Et^livTCTHW3dC%S);Z`s+mNq%sSt5ep%ce^j@?CF2By@+UNVm+Ar0-hJ zPb1ND5%Z9{m-AiZUXqr!_>g%5k-o*Nv`8;W%$g?<>07)akq%_mssNFh7Vq@#ta&_< zzQt=jr8rY2wC7tqk-o*Nw2H)>(6@LZeT(-;LELHaEuKi<;(ckeES^Z;;(a7MwQuo6 zj%D#BLE#F(_nJh)nrYE;Ai>uV?m+k!Po!GBfn^}ErVkp|ZugcmYq$5BTwCT?^C2SD zZhfTMZPt85wXq*|Yk9LxHMRO|DR>NT^T@*uLo zNEAgrQj(3dup!X6)<>jTUmg-RzV#8Q)|ZFOT1zETt*=;a6~9dQ zA>aDY6K#9Si3!?2$7)X^wLKN-`h=1s!Y6>n)h&_Qo+eZN`O-pC(4>*to+eZN`AGB= zzdc!|wx=Tf5efaoZ%-n%Jr(Kq6?ibeJ&DxzRHR=fY{(x4iPZMYLuPpsBGsEH5~&(W zaxf&(_a;QDH&JRInVk3W%9TjmXCn=>anPiZx|(G&<)3TuNW;~YznVp9Q6;BZDde+)WWLB; zUKJqH-|^y?`4>U@J6?#y91BqcQZ(1${%h$JArBr$7FO{A|OMGD9u;g9`MkVs!cJ~C;2QRMC=$lp5< zy89sfd4IbXApidVQmG~G|1UDX-KNHmOpY3sm~;A>#d6GXQVt~i$72UdGmITLKD}0m zto;v`A?QyC=szWiS#wq*wRIJ#R;;b7p2f8bBDHmWq!ee$#2D0iZp%B$Vz0^ zl|GSb|B6&;wM;0@_bo)KZ&9SV)9jR)bw_|mo#QCdFB9X0KgS_b=QxV=Jt5LTlh&=y zaq^JU1mn+f_LVei3E+wlVhKd5B@kz?M#r)QBGnRnB+^R~v(|iwR7>!YNCz@&CkT;h z2|g0(KxXX(AyO?tks&)lh*V36kpMZP^Hr4XTlqY@j;M9Iv~ zFw$^t?-SFag*sZl3N0@I3&%8dOFTzXXaJ+;XkJ74+8Di`zQ89&+k#kHTZw6q$nc5L zoTCysEiB87Q)KwWT0ybELfH*)nu`pd7!@3qC^xX`Z2y&0Wcb8T>8M19vyezYhEI$p z8l35uqsX+{;KUOdJ~6uAs6>YtYbWfNJ~2kRQDjC7iqRnSRo?WA44)Vm z5~C6w;_2oT89p(TI%;y`7TndGBEu(!dmJ^nF)_wl<9{6Dy(Gmoq__pM42i^QNOe|q z7&$mguwsx{4XNG|XY~{k!(JFLOo+cMnCou8r;ykhQYN`C?c@iit-Iang{;Im3{+ z>pE#jTwRlfFosmHEtq8+B+jr6%o%;#AhGEiMo2cdeDnrx(RVT=woWFlAf)wegT&T0 zVq&_2q-~Jc+D6+U={GltGn$(%m>g3`oYCBD z!DMrjIHS3TjOvojP2!B^<`W#r=H?vG_LSH*vQ$Un4Ao_MQ4*`_oB;@m^HoP;tGY40 zD2X#vm*quCY*mLTweim!G?S_$u~l7cNWDhpEY;bb5)Yb#hB(<%$l3Okn3(pQ>?!kw zfosoWHVTOY8->K$DB}!mB-Tc0uwE1sUf+F@7>&XZPXg%}llDwv=$>IaiFC%8Y?MVp z6RZsq2Wo@Fs*Q1Gj3icVr0hA_yGd+KlvXExAj?EaY)v$_I`N$nvb14MG&ZCx6D8*i z6Q#>dn&@IFD_GAY4%9P=RnOyC9f?)X<5(Sut)Amyg1tLwbxXVo#(K{3btKjbrfdTl zc4#B9R?x8xXxR64Bt``p@KQMAk$Ab3G$az+3dS;X3X!bfQeo(};0z8t=&A*i<;qNA ztzccWiAXFALwU&xk{A_ah-J>2_K>(iY0DRnB0^RLNsM|h#GG;Gz`wR4vGp7AFoBx| zeorAWdJ03#8TSYLYbz3KPpOY$L&75$Xr8p{IF5l;%o+C&{A(+6&Y1R01+DR<){sbS zr#*3VPdCKLX%C6*lsI+;FE_-=DKUxZevlm#?{0{Z;fsOmj8T&ti}7l6iVUAv&dbEH z)$L=5k>L}=E=Nsne4VnwoFc;~hBc0w+?aT!IYov~jK&%@x$&TRusKDBPYjniYI5TW z9%4?B;S+OShU|E>!c8CENU_ArB*pE6G3Ts4NMh}S<2V@-XY@gKD`fa$G(bKR;-128 zg$$p#u}tdNGrJWsd}6l`mfaV-RdTeV%(f54R!7H}oKP*7a$MELhLoi`5?j^9dS*K% z-4}_Wp;3vBf9Cu-sX7uvL!+Rz)1E2jG^x4+BrRBG5?h($3TDYnVk>iO&ohh|NtsD( zWscp~%X4K$tB#u7TeUIi3X;u@ei>Xr5^DwP?5bMUm_lM(!B`u-EKOFB#DNtgv8`Zi z8~GK43aE{kcu%98q&<^!b4(o1>*yGfVS5URi!pI*{J28%#}pE`#Kf@}3k@+ce9jqT z$`V7Iyp$$qJEp{XhM{vufX~^EDX}3PV~CSu3OQrw7&W;u@mh0=44<rxrR77rjWB8Q{qN>iy=;qDI~UIN=*C?L!2B_NSraITw#cl zV+x7U??+AUcD-T42^BK@3Zh$(IBvl!4Hg+bF;;6x9Bbo4h8P(>F)mn19E-s*1sOgu zTqcQQF+L(m+|uF`W65C@nRbrE0SFmB@rWTLae-4}4nWAT#Eaz&UldTzaRs@)QSPu{ zQwx9B8YoRUV#+I~{AKd}lRq?h%j9K~hbI4K+&?Vi)!*!@t~C%P`|I;?9(*PlDT)%j1In>&|u4s`yiwG2aO+VJiqav#%YazX!u&g zwGF2>?AOrK@M!(#>MyT9zJ7K+-uFN5{r|T|(d)!gaQ`0zNFiElZicOCd8~h_Ip_2L zxM2CXL=Cs@c;ak5&im#4|2-s|lL+b8aZs0sw30+j^O!FqM|t-Zk(f~+YQSvPe;~b}$j?doXPkqyw3?Z-q#BCqxbEHIY`52#aUF?JGq3 z9&Ej`DF4E1`W|eK;)E_aacdJ`g5LyDYhsQ9l$`Wy|Zk5{B$rc88GKAvT&kIzGP3)1)TM5>Qh zq_&CxjD~vT*Z1*6s*le@;@ZRa@kFYRSETFXOM=2|-S_cC;!+jyO%f4&?z)=7H0yQ;oA z=X_`Bwfd@Ljf?2_jpE{^~9yO z+2b{mdwd)c7r5$H`z@E&>YX1~=)?zeGB z^dYm~Y9#mDIAjAM&3>zq+;5w(OUY!YBgxE}S|hpNc8x*eVX@h7HIn;n(}~EjJ@Jc^ zFqu>0(kAu3QDmoocL+VrL?-n5o}jl+>I}G!kv4+e>3jB*ux^o*K#Rsd4_dY_MOT1>?kQ zPmSdEBmpNdy;`l=1~xR$ZSuIpX;` zjEO9shjb*Xo_qAwvKeEi^EBt7mkStGI-r0y=^o?$18FrAnR#YNi-nUJ0~>XZQRivS zLuRXBRQvM~`?I&nynyal|=y1WcdMo~~e*SOcLes`sH!nc&IcxZyPx##Y z%|;ibkot_)N8;T4N?PzF3%KA}y+%R`D-#*aGo^g{=jIv-6wd4!`SLzGtEWIe5~*wF zs5b}R3YGRtc$7nl>zPzqjpWjr$fVM0B$t+vZ7(hAh-;85-AlC~5~Yv226;!-6Q$x3 z!;#YpgqB@T&eSm=Yu_d@jqmq?sv61N)3^)!)?7ifukim#DePe#7HG~DB( z?#{p8?$T;xTxqGGZfT2KMI+79GDD2S{T{PbG!l$s;d+`#v?uhzR%z-)yWR|@wQXw^ zjpTYVvMoJcBe|Y&$f$WpBZ1%rwK4079`YLsat z*E0_JIF(lG%+hil8EMvYHx=8gXSa6OQzOlKMvWEN1pAOin)M8p7WQDstY?oi)IU-bAvptg-(nu~XBa=(3&u=x7OUuaQ z(&~El36+-X)|Nh`kz86vCYLstCzsYkUg^J63t7~0rEjRTTu&}-61N)3rDbGtX*IVR z$))v>Z76NOP-&4jQd>%^kz8662`>d&qUIrugWI)JwA1-^beI*Dd`WF7W)NS zGPGz8{Mke!xwK@UQV-!)H1jkWifYfniFqc~QzH*9 zPhHO;iFroXQ;+PSiOA^E>O6-fBBS#RBF%dC*N@KuR4Izv;fZ-hmsZzPBM&Z5UD^?e zd7`KVTB7=pMw)q^U8mnLU}RK1N2)wwfjVJ9;@$_3SJD!7$3-K7fR%~Fet{O8o0xZ8 zG!iJxij0gZtv_pOZbv0D6wK4S6QPkNLs2s|Y=UP}8p(6KQqmuD9*R1Cj&65pHL^XW z)yVdg_NaE3RwLU}T8(T^X~(p?v>KUITC{Q0aYZA|(mudlg4P9EFv?(~`;h*nmPS=t z6PetH^qkPC9rX+%53Zg;q*>bJdTM0n#L|M30xeN9m_`xC2yW3ME≫bKNQT+B19~jFDz(qmI1c`(Sa% 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 z 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

949dI)CB9L~1Qdwyo83t8?s5>FS z6=umByz4rv(^zR0dI-%LR#=P^Zs5bLAsLT*mB^B5w$XN49nJDGsWMizu&Wks;0F!R z1EKK_``0Vi&9z&zo>9&rk@>VGuVJ+V{H@j|Ry)| z-jZewTAAr1c15?|PWsENNvRx+`G)bJyt}lYBI}abGH)%*Uu~4dV2hTJWD|OTl#7Bp zlg@s7(>%tmIE1*}%po5K|G{djV=Q$Ja1&(_CJN;~8S=MT;zF9x4C>3|RW2K0%3Olq z<}noWm>_)-T%18tXB5d0a~<=HiXBpc)p6Fg9CaqO_k`_%dE;+M`K;Q2MGgyTeXub; z6|FGe8Xz=YY58#_ZBY*}%Qu?%(;YU#dJC?n{CGRX7EI9WuJp`HvxZ2EV-tL!IM(vF*8b3EAJz`8` zP>~}MsfEYJ4+v=%zgbTYxf#4Ecv5g=)U@yh!5PV83fW@QLPLU&2Q3L25cE%Um7uwa zU1P5Vt_v&`*(b16V5h8%Z|v@dWD@&8jzHt zowjW&bgu9M+Zla%}F{unNfk&SClJf9Ei6i~pTN_QC(o>wDmT z=jA>2zw=sN_}_UwFZ}Pkp3lB04#f*EKCkDa7oWrM*o#js_S}ol>$&B{=Ow-L;`6#b zdht1o0`lT>SYCVad2OG(_#A>4UVL89OD{gJ>ya0q*YLoL&&zx1#piW>@Z$6O9((b5 zEuXyj972J3@j0Y?y!gC~+g^Nv=&l!^m!6#2iA6LBd!UR3!(NHm19_R3ifr7Yu^qSA z%aGOBafb&z5mq@hzpdQ0!t2Q513A2H6N>JVdBC7)BGLoi61L;wB_h6S%u0x;08s)K zKfupnrI{^-mvk$BfS2?!et^U9Fn)m7DKP&(hvuRGpVuiM|38N{v|ZpA(l+eg9<+)v zR{6#ba11{A{y7AneE%GRm%e{q*F)bwuj97wpO=0t=Naa+PqEKOvGb=HQ2>zv9E(qp z0UUxCo_$`=EzdqL>7i$z*Kymk&r9dw+2{Z6foGqWzYU&!4%Y+EJ}-abjTc!YfROtw z*v$^)LxeS#*?V{yuk1~{rrVYuUOJyB0bb^|L`)&h$~;O+4s7J--d zFcyK=@hBF7*YF?~ftU9n7J-+~Cl-O1@iG>H*Da7(1P;lESOi|*qgVu9W5wA~O7sGJ z((s*7gbE@@;GwqP`NC`X9KFDycpbgKYkLvB!0Y)Ky})4B>P_qd zujzB_0*8`tPc(}~P-8eKwng05gJ=(Fxuh}lAl`xF_+Q%f`WUak`&$q@=gs=WxMh*0 zLd(b5LQ5x}iL4X8CS+R3q{t&tSE852cMT~K(I&ESk(CiE3x_0B4mlowT@Mf07Ca%i zX>hfuCEPXvF#E!h0fP9wIHoUKfus($^Ce3Ft@0uTT`}=X?F&BQc;l>Z){{QIW zr)}@BFF5~SjQ#%&`@atRU;KG@=7>b`+toXW{X-DDG@ukaPXb8zyG`?FkB!RTPgJ~m z>|N#WyQXfwd|LUt#%>n+R{8seo=N-8D1RT__xCermA^kXKKjpS)@-!A;K8XFxCw?~DmG-=ltyGt{-lAWwpVHq?zgQ@M5d(m~)3;#zuMqpMQ2VbK z`>$C0uQ>a!c>Ave`!56~5adGkUrF{~h3&s^rva5KYX5~e2l|E#2=uF*{a1PWuL|~G zsrFy@+J9BF|EgsFRoVXQKKrjK_Fq-)ztZf#9JlIYHa`2#QqDpAc#Vb*nef%f3>jxYH9zKY5{;RG1 zS3CPJFc?AZX#ds8{_9cuug>;gUF^TQ+JAMk|LSi4^_cxv5Bsm;Pkk|*u)VPFqmlH> zKYrP0`Zc`s%*W~1stJ?E(y#9qk9r~q)wB*v_l*cbHEr+D>qiBlnpU&=yfIYnuMSCF zg7DC)JrUlO&n~TM_G?Y(*PuDiH>F=YpZ-@4{krwm3&ZGF^@C66(l6XpO23vTW{sd< zXKVBrNxyLK82!Snqx5UW(%NI_*RFk49;aWnD`m#gFWfguzjCTajnjchThZBnJblA` zqB_4+wAh;locxapbeu}1VznA$oM#n>|_{it6^sVoZ zJ#ji7+Jf01#?!Yi-(8!a@K2JIv(0r^-q?eZ}I&O-J|27HJ`SDqo6*;r)3^KYznG!pp=EVE)q=h) zed0(<9S`mF8#`Okx57I&W$JinnHN{Jrf<(hE^4FWp>417a$EX_+s1T$A*@rEje(H|VV6p-pR3y$gNYF)FpIj)(Toyb|5$ z+XElRch~XIvcC&?jJ~}U`uAfx9@?3Ef9XNrie!G*Q^!MVGvdo$^lkd92YTyxXgjxj z+=ss1I`d9n`h}a%bbkHW&L65rt_=L&JLSAkiOwgGo4>-)^>B&VEQ)WbdM|@ z4{cXK`ytd1Te(NFiE0lve|RX-Dracb9Qw85#d{1%eeV4txjG(Nu~Sioq;BUIFha*e zd%nzdLuT)8dTFGNho%iVZOH5zvyYC}@z937yW5c2E5F+OxQ>VR-K{l-%*NenI=^78 zedAZgQJZnAn$E9Q+cWb?LsI*_GhEa0&>s4-zaN#${kx05j)(Sk$;<%ycD`YHppJ)D zd_avL`qp7a#b6x|?S*xv3`xEBSYoJ-hvxs6u2Z?1#c%049@_BwR}Cq;s_*yVIv(2h z&wXV`(GqJujieg5=S}CAz0JD*t|2>dr<=|%b_=Mxz>uA|!A`#-z}<9|{E(*YVIw)x2Ry(MP*qE}`S0&6#wjB$Yd`>{uxs4=w1x-n-}545?LzKwpgaYY>uZQb~qmFU}#iz-*v@z6@|E`1+;>vAcnijIf&QglRB`u1rx zt(uO97Si!|LyFdY;)na`UvaCQ&abvxzvJ)&^bI%I>HHeIyCXLlvJ>~!>HN~Vm)k8g zWaptVFV)oX&_Z9IT8sKo?~`%0iE593pYt%$YC~AxI`r$ON{`kh9A(D$JaUudP{q5b^9 z)0y04BN zeW;Fy*0}FKL+KlC3Do&jftyyJH>4=;2h{l`fvMLI8d9`((N9L`cxdzMyld#YU-Vir zO2Ue0s70!NwzTI29*Ek&ytxt~*>lk`x%%|1-bUd`CSIZiD=Tn7>8L|^M7V7-k!r!|E8nP3&6YBhm!oJIX zGBi-!MX2)&3BSDZxuJo^ChXO9JhVq1+!99pnABxmI8p7xCznJJt**WKY9#%tw0DM~ zf%dyR(U6^Q#Ey)i)}Kfl7^~x<#XZ_Bj=nV;-#T8$LwkBrqXhc4W!FQAIv&~|KUOM4 z-zrC!PSWwv`d3RTOy3rE2v64W(7qaLD?;CJPomB*OKiU5f+0n5L!!>FN&G0{upvdS z-?yWyEDf)JD+lzPUcxVaVKUX1BXs0r^R-=9t8n)qn zqFT$Bm!%P{p8a6n1N3X#H!}?l^e_LX4cS?(?C2VVV{o&jaeKe@Y%AvBegfbRg1BpSWm9 z(ZaV*rR#WTnRk6=NYUpS?P{#!p=}@dK@$L?|~cD+vs>`*(vw7 zrEhQ5E7?xRLp#$a!O%O4JQvzQ$3ttg`fo#uPXFwejyfLN&Og30r0A_8Cmz-D(5lxt zXh_kay|#7H@z9n}*=Welvn!W()A7)X9-eQ=&bGhLdQ8Vdn^E`~Lw4?}^>|Mm50)%^ zNH1#NgOhvq*74ACmbW+b&J_nA>8sv(9z7j+#&z3i|n z^Kl&y?S&uH$I`dGQ4c+#nFl>Jha&(hZ=h4{?~d(>Ud~@TRR%Ev-Y{>(K;U5$dG!5>|B$Y zX6T(iv@9Q|L{pyQ#<`7kJvdU@d68;Lp|T2Ro>h7^6c{MjTO4{cP& z7lo-GYjgG`6V)!h^idI_)m*Rux6jAof@Oqu|I&NQovH5pVN_^{M` zIgf4U;Jnky*zjRlUHfy6JMVNJR?dbGOQ8vU%M-q&m7U(R;lnchcq_J@ho67Qw$qlo zb|o7=EVXJ@VB0w)wRmM4J}hg-cX?=48$K+Bk9x7~O#bU-H5)!G-^4tqPUARI z?T;G7HJ_AIHHlZXGY`}v=#ynzYE$LT@4j0iL2;qaIMy3h;dWCSJ}m26U*uTt!SG|v zZTPSh{eCxFsSbOxKDOb*GV{&~wo=D~zHep2hsD4AH*BTqww%z$h7Zf|p(EHzt)JH~ z$%YTh!<}8&N)@}+rkxERmXv_TY^7$EiR)m)hvh``N^GS9hLq@N!-u8b-27~%Mr;r7 zWW$GL!*v^5sYkxAJKOMKDPHPP7n+5RP5wZvSuQjZ%?>21S@<(>YSedwpD-wx?(!-r+g=3eRa-N`E{{cQNK z1bKbTR;oeqhW%~$uzZ?OV*rgKE4|!6;@XqxZx13~mDreTFhQLz1#vxgu7~v#nypiB zzhEf1(cPi+-3NUx4Of@4Ef$Mo{O%Ke!Y0-3Q-#5Olid z7gmBorhMv2Q2e_7URDsYj6U1Vo4(uRl5Df$!}3>wL?8ODWc_-+R(x2xbg%43(7Z28 z`qNL(tSJy+#fK&IbYviX*YK5ZkQE=6G5IaQ1Z|Fc!uIM}*Bc==d{|0-agOa(*PjoE z+3;bR|N9QMS7-lTA7R6XB`ojqNaB5?+Vi4p_^^D|d1^F$mpy)5j13=_=PQQB(s!kg z_sM0$ho#%|)ZFylf?Tcg*zjRFSL4IH^j&yrt$a3oSUw#09!GeY%Zt5b!-r+dkvtsX zy?7c@(1s67nHVpQ@Y1TiEM&un<@*lz*}nAkJ}eQ-PO`m9IJCd04Ih@VkF(ic zZH-)0+=dU!-<210tXH<(EVfeJM}PUQ4Ih?;i$}ASx^Q4%DH}d4kq^7GmHH^WeHj}* zEaNIQV=J|-ZG&<)d{|zNtXiJNQSOJ*?-AE}>?>4(c=f}*=!yhg3<;=2^A=UX?R_gg zER9?L^*(*~`S4qnt@yBPUvQxcefQ7qqgAc=u#~^Es~UaRGbpRN6(5#G0eu&<{hfF#J}imX^EIUJCisRovf{(Cv!v}q`tEh&s}HUCuv8fM zFoC}7J?q*>R(x2NY&qSSzPs|r!6sIGSYmD4*ornS@k>+s>BPoMn_2N;*_AP;Ieq8y z?N=?V_^?#m{MpC!U7st1TUzm9S?bxV6@7QLSW0UvJ}kKsTC|~YG)s?fOI-V6di5mY z)$Xja$pl$06)~24!rlM>@BjBXP&4ZP{_jR^wcRSYwRc+;J3Dq6RT? z$Su|_*v-rBm1_&PMX^(2hsUPHwvUaC2##nJTPe0sY;f$Wn42*tVz$OCkC_oOCZ|@4D4>o$GSf1+Ft( zC%KMs9pc)@wXpZV66BrbeZWg z*(K9usBv3US7rU5PSe|5=oEcp3s%2(2kegi1oZir(vqP|W0M&gKRbn? zKQDG+XvOnk42=$-#?aY#0o5tEh`$@?x|E^Vt3NT+>BUNh=2$i|G`Y%WVd&1_eGE0e za*Uz#H_tJ&q4gz(ZnwV1P~qJI+BV@Xf48ih=P4S;x)nYQUHhg0L!09ZGUUCXBtv_4 zlwxR{wLC+o4pd_3M7~-KdG)EsP_an@3YeC_-{GxcqKlh@3HoYRGDC&;cV%dI!NCj# z*uG%sc7bmgsyR$RPp8k~@20rTW5_yn14F0&+|1Cy8M_$DwQvtZE5AL!(9(T37<#

yVfKldjZxci97N7J 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

_cez*tM=Rj>0?6eGpoj}fV&Pos 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

4Ct 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%0A?pfizY7l7RCBjyMGtvvsmEEu~W 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⪥jp9nkr$g6!Y7Ge5m=)mOkMTKsU}of3E3 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 z

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 - - - - - - - - \ No newline at end of file + + + + + + + + + diff --git a/Simple.Data.SqlTest/packages.config b/Simple.Data.SqlTest/packages.config index 27a38197..0c821784 100644 --- a/Simple.Data.SqlTest/packages.config +++ b/Simple.Data.SqlTest/packages.config @@ -1,4 +1,4 @@ - - - + + + \ No newline at end of file diff --git a/Simple.Data.TestHelper/Simple.Data.TestHelper.csproj b/Simple.Data.TestHelper/Simple.Data.TestHelper.csproj index 82e3e443..32b7ad7c 100644 --- a/Simple.Data.TestHelper/Simple.Data.TestHelper.csproj +++ b/Simple.Data.TestHelper/Simple.Data.TestHelper.csproj @@ -1,84 +1,89 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {7DAB2F13-0392-435E-A934-4567266714BF} - Library - Properties - Simple.Data.TestHelper - Simple.Data.TestHelper - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll - - - ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll - - - - - - - - - - - - - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} - Simple.Data.Ado - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - - + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {7DAB2F13-0392-435E-A934-4567266714BF} + Library + Properties + Simple.Data.TestHelper + Simple.Data.TestHelper + 512 + v4.5 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll + + + ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll + + + ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll + + + + + + + + + + + + + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} + Simple.Data.Ado + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + + \ No newline at end of file diff --git a/Simple.Data.TestHelper/packages.config b/Simple.Data.TestHelper/packages.config index a5246444..ff9a5c67 100644 --- a/Simple.Data.TestHelper/packages.config +++ b/Simple.Data.TestHelper/packages.config @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/Simple.Data.UnitTest/AdapterFactoryTest.cs b/Simple.Data.UnitTest/AdapterFactoryTest.cs index ebe23c3e..a026a2d8 100644 --- a/Simple.Data.UnitTest/AdapterFactoryTest.cs +++ b/Simple.Data.UnitTest/AdapterFactoryTest.cs @@ -1,100 +1,102 @@ -namespace Simple.Data.UnitTest -{ - using System; - using System.Collections.Generic; - using NUnit.Framework; - - [TestFixture] - public class AdapterFactoryTest - { - private static AdapterFactory CreateTarget() - { - return new CachingAdapterFactory(new StubComposer()); - } - - [Test] - [ExpectedException(typeof(ArgumentException))] - public void CreateWithAnonymousObjectWithoutConnectionStringThrowsArgumentException() - { - CreateTarget().Create(new { X = "" }); - } - - [Test] - public void CreateWithName() - { - var actual = CreateTarget().Create("Stub", null); - Assert.IsNotNull(actual); - } - } - - class StubComposer : Composer - { - public override T Compose() - { - return (T) Create(); - } - - public override T Compose(string contractName) - { - return (T)Create(); - } - - private object Create() - { - return new StubAdapter(); - } - } - - class StubAdapter : Adapter - { - public override IDictionary GetKey(string tableName, IDictionary record) - { - throw new NotImplementedException(); - } - - public override IList GetKeyNames(string tableName) - { - throw new NotImplementedException(); - } - - public override IDictionary Get(string tableName, params object[] keyValues) - { - throw new NotImplementedException(); - } - - public override IEnumerable> Find(string tableName, SimpleExpression criteria) - { - throw new NotImplementedException(); - } - - public override IEnumerable> RunQuery(SimpleQuery query, out IEnumerable unhandledClauses) - { - throw new NotImplementedException(); - } - - public override IDictionary Insert(string tableName, IDictionary data, bool resultRequired) - { - throw new NotImplementedException(); - } - - public override int Update(string tableName, IDictionary data, SimpleExpression criteria) - { - throw new NotImplementedException(); - } - - public override int Delete(string tableName, SimpleExpression criteria) - { - throw new NotImplementedException(); - } - - public override IEnumerable>> RunQueries(SimpleQuery[] queries, List> unhandledClauses) - { - throw new NotImplementedException(); - } - - public override bool IsExpressionFunction(string functionName, params object[] args) - { - throw new NotImplementedException(); - } - } -} +using Simple.Data.Operations; + +namespace Simple.Data.UnitTest +{ + using System; + using System.Collections.Generic; + using NUnit.Framework; + + [TestFixture] + public class AdapterFactoryTest + { + private static AdapterFactory CreateTarget() + { + return new CachingAdapterFactory(new StubComposer()); + } + + [Test] + [ExpectedException(typeof(ArgumentException))] + public void CreateWithAnonymousObjectWithoutConnectionStringThrowsArgumentException() + { + CreateTarget().Create(new { X = "" }); + } + + [Test] + public void CreateWithName() + { + var actual = CreateTarget().Create("Stub", null); + Assert.IsNotNull(actual); + } + } + + class StubComposer : Composer + { + public override T Compose() + { + return (T) Create(); + } + + public override T Compose(string contractName) + { + return (T)Create(); + } + + private object Create() + { + return new StubAdapter(); + } + } + + class StubAdapter : Adapter + { + public override IDictionary GetKey(string tableName, IDictionary record) + { + throw new NotImplementedException(); + } + + public override IList GetKeyNames(string tableName) + { + throw new NotImplementedException(); + } + + public override IDictionary Get(GetOperation operation) + { + throw new NotImplementedException(); + } + + public override IEnumerable> Find(FindOperation operation) + { + throw new NotImplementedException(); + } + + public override IEnumerable> RunQuery(SimpleQuery query, out IEnumerable unhandledClauses) + { + throw new NotImplementedException(); + } + + public override IDictionary Insert(string tableName, IDictionary data, bool resultRequired) + { + throw new NotImplementedException(); + } + + public override int Update(string tableName, IDictionary data, SimpleExpression criteria) + { + throw new NotImplementedException(); + } + + public override int Delete(string tableName, SimpleExpression criteria) + { + throw new NotImplementedException(); + } + + public override IEnumerable>> RunQueries(SimpleQuery[] queries, List> unhandledClauses) + { + throw new NotImplementedException(); + } + + public override bool IsExpressionFunction(string functionName, params object[] args) + { + throw new NotImplementedException(); + } + } +} diff --git a/Simple.Data.UnitTest/BeginTransactionWithIsolataionLevelTest.cs b/Simple.Data.UnitTest/BeginTransactionWithIsolataionLevelTest.cs index 408b082a..81378771 100644 --- a/Simple.Data.UnitTest/BeginTransactionWithIsolataionLevelTest.cs +++ b/Simple.Data.UnitTest/BeginTransactionWithIsolataionLevelTest.cs @@ -1,115 +1,116 @@ -using System; -using System.Collections.Generic; -using System.Data; -using NUnit.Framework; - -namespace Simple.Data.UnitTest -{ - [TestFixture] - class BeginTransactionWithIsolataionLevelTest - { - [Test] - public void TransactionsGetUnspecifiedIsolationLevelByDefault() - { - var adapter = new StubAdapterWithTransaction(); - Database db = new Database(adapter); - db.BeginTransaction(); - - Assert.AreEqual(IsolationLevel.Unspecified, adapter.IsolationLevel); - } - - [Test] - public void TransactionsGetExplicitlySetIsolationLevel() - { - var adapter = new StubAdapterWithTransaction(); - Database db = new Database(adapter); - db.BeginTransaction(IsolationLevel.Serializable); - - Assert.AreEqual(IsolationLevel.Serializable, adapter.IsolationLevel); - } - - [Test] - public void NamedTransactionsGetUnspecifiedIsolationLevel() - { - var adapter = new StubAdapterWithTransaction(); - Database db = new Database(adapter); - db.BeginTransaction("tran name"); - - Assert.AreEqual(IsolationLevel.Unspecified, adapter.IsolationLevel); - } - } - - class StubAdapterWithTransaction : StubAdapter, IAdapterWithTransactions - { - public string TransactionName; - public IsolationLevel IsolationLevel; - - public IAdapterTransaction BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.Unspecified) - { - this.IsolationLevel = isolationLevel; - return null; - } - - public IAdapterTransaction BeginTransaction(string name, IsolationLevel isolationLevel = IsolationLevel.Unspecified) - { - this.IsolationLevel = isolationLevel; - this.TransactionName = name; - return null; - } - - #region IAdapterWithTransactions - not implementead - - public IEnumerable> Find(string tableName, SimpleExpression criteria, IAdapterTransaction transaction) - { - throw new NotImplementedException(); - } - - public IDictionary Insert(string tableName, IDictionary data, IAdapterTransaction transaction, bool resultRequired) - { - throw new NotImplementedException(); - } - - public IEnumerable> InsertMany(string tableName, IEnumerable> data, IAdapterTransaction transaction, Func, Exception, bool> onError, bool resultRequired) - { - throw new NotImplementedException(); - } - - public int Update(string tableName, IDictionary data, SimpleExpression criteria, IAdapterTransaction transaction) - { - throw new NotImplementedException(); - } - - public int Delete(string tableName, SimpleExpression criteria, IAdapterTransaction transaction) - { - throw new NotImplementedException(); - } - - public int UpdateMany(string tableName, IEnumerable> dataList, IAdapterTransaction adapterTransaction) - { - throw new NotImplementedException(); - } - - public int UpdateMany(string tableName, IEnumerable> dataList, IAdapterTransaction adapterTransaction, IList keyFields) - { - throw new NotImplementedException(); - } - - public int UpdateMany(string tableName, IList> dataList, IEnumerable criteriaFieldNames, IAdapterTransaction adapterTransaction) - { - throw new NotImplementedException(); - } - - public IDictionary Get(string tableName, IAdapterTransaction transaction, params object[] parameterValues) - { - throw new NotImplementedException(); - } - - public IEnumerable> RunQuery(SimpleQuery query, IAdapterTransaction transaction, out IEnumerable unhandledClauses) - { - throw new NotImplementedException(); - } - - #endregion - } - +using System; +using System.Collections.Generic; +using System.Data; +using NUnit.Framework; +using Simple.Data.Operations; + +namespace Simple.Data.UnitTest +{ + [TestFixture] + class BeginTransactionWithIsolataionLevelTest + { + [Test] + public void TransactionsGetUnspecifiedIsolationLevelByDefault() + { + var adapter = new StubAdapterWithTransaction(); + Database db = new Database(adapter); + db.BeginTransaction(); + + Assert.AreEqual(IsolationLevel.Unspecified, adapter.IsolationLevel); + } + + [Test] + public void TransactionsGetExplicitlySetIsolationLevel() + { + var adapter = new StubAdapterWithTransaction(); + Database db = new Database(adapter); + db.BeginTransaction(IsolationLevel.Serializable); + + Assert.AreEqual(IsolationLevel.Serializable, adapter.IsolationLevel); + } + + [Test] + public void NamedTransactionsGetUnspecifiedIsolationLevel() + { + var adapter = new StubAdapterWithTransaction(); + Database db = new Database(adapter); + db.BeginTransaction("tran name"); + + Assert.AreEqual(IsolationLevel.Unspecified, adapter.IsolationLevel); + } + } + + class StubAdapterWithTransaction : StubAdapter, IAdapterWithTransactions + { + public string TransactionName; + public IsolationLevel IsolationLevel; + + public IAdapterTransaction BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.Unspecified) + { + this.IsolationLevel = isolationLevel; + return null; + } + + public IAdapterTransaction BeginTransaction(string name, IsolationLevel isolationLevel = IsolationLevel.Unspecified) + { + this.IsolationLevel = isolationLevel; + this.TransactionName = name; + return null; + } + + #region IAdapterWithTransactions - not implementead + + public IEnumerable> Find(FindOperation operation, IAdapterTransaction transaction) + { + throw new NotImplementedException(); + } + + public IDictionary Insert(string tableName, IDictionary data, IAdapterTransaction transaction, bool resultRequired) + { + throw new NotImplementedException(); + } + + public IEnumerable> InsertMany(string tableName, IEnumerable> data, IAdapterTransaction transaction, Func, Exception, bool> onError, bool resultRequired) + { + throw new NotImplementedException(); + } + + public int Update(string tableName, IDictionary data, SimpleExpression criteria, IAdapterTransaction transaction) + { + throw new NotImplementedException(); + } + + public int Delete(string tableName, SimpleExpression criteria, IAdapterTransaction transaction) + { + throw new NotImplementedException(); + } + + public int UpdateMany(string tableName, IEnumerable> dataList, IAdapterTransaction adapterTransaction) + { + throw new NotImplementedException(); + } + + public int UpdateMany(string tableName, IEnumerable> dataList, IAdapterTransaction adapterTransaction, IList keyFields) + { + throw new NotImplementedException(); + } + + public int UpdateMany(string tableName, IList> dataList, IEnumerable criteriaFieldNames, IAdapterTransaction adapterTransaction) + { + throw new NotImplementedException(); + } + + public IDictionary Get(GetOperation operation, IAdapterTransaction transaction) + { + throw new NotImplementedException(); + } + + public IEnumerable> RunQuery(SimpleQuery query, IAdapterTransaction transaction, out IEnumerable unhandledClauses) + { + throw new NotImplementedException(); + } + + #endregion + } + } \ No newline at end of file diff --git a/Simple.Data.UnitTest/Simple.Data.UnitTest.csproj b/Simple.Data.UnitTest/Simple.Data.UnitTest.csproj index 860d6f75..48228abe 100644 --- a/Simple.Data.UnitTest/Simple.Data.UnitTest.csproj +++ b/Simple.Data.UnitTest/Simple.Data.UnitTest.csproj @@ -1,133 +1,138 @@ - - - - Debug - AnyCPU - - - 2.0 - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58} - Library - Properties - Simple.Data.UnitTest - Simple.Data.UnitTest - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - 3.5 - - - - - - - - ..\packages\Trespasser.1.1\lib\net40\Trespasser.dll - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll - - - ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll - - - - - False - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} - Simple.Data.Ado - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - - - - - + + + + Debug + AnyCPU + + + 2.0 + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58} + Library + Properties + Simple.Data.UnitTest + Simple.Data.UnitTest + 512 + v4.5 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + 3.5 + + + + + + + + ..\packages\Trespasser.1.1\lib\net40\Trespasser.dll + + + ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll + + + ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll + + + ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} + Simple.Data.Ado + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + + + + + \ No newline at end of file diff --git a/Simple.Data.UnitTest/packages.config b/Simple.Data.UnitTest/packages.config index b9dfee6c..dca05329 100644 --- a/Simple.Data.UnitTest/packages.config +++ b/Simple.Data.UnitTest/packages.config @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/Simple.Data.sln b/Simple.Data.sln index d366f8c9..6373b381 100644 --- a/Simple.Data.sln +++ b/Simple.Data.sln @@ -1,245 +1,312 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data", "Simple.Data\Simple.Data.csproj", "{148CEE80-2E84-4ABD-B5AB-20415B2BBD21}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{10F43335-5672-4BDA-91BB-5311C2BFA409}" - ProjectSection(SolutionItems) = preProject - CommonAssemblyInfo.cs = CommonAssemblyInfo.cs - README.md = README.md - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.UnitTest", "Simple.Data.UnitTest\Simple.Data.UnitTest.csproj", "{1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Assemblies", "Assemblies", "{BA656253-3472-4A47-8640-976E89465B6F}" - ProjectSection(SolutionItems) = preProject - Assemblies\sqlceca35.dll = Assemblies\sqlceca35.dll - Assemblies\sqlcecompact35.dll = Assemblies\sqlcecompact35.dll - Assemblies\sqlceer35EN.dll = Assemblies\sqlceer35EN.dll - Assemblies\sqlceme35.dll = Assemblies\sqlceme35.dll - Assemblies\sqlceoledb35.dll = Assemblies\sqlceoledb35.dll - Assemblies\sqlceqp35.dll = Assemblies\sqlceqp35.dll - Assemblies\sqlcese35.dll = Assemblies\sqlcese35.dll - Assemblies\System.Data.SqlServerCe.dll = Assemblies\System.Data.SqlServerCe.dll - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.SqlTest", "Simple.Data.SqlTest\Simple.Data.SqlTest.csproj", "{EFA5B19B-D24F-497E-AB48-8588ABFD1D01}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{182AEEFE-9B89-4264-BCED-91A00D1EF896}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.Mocking", "Simple.Data.Mocking\Simple.Data.Mocking.csproj", "{292611F6-BBBD-492D-891C-0D9FB4BF5433}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.Mocking.Test", "Simple.Data.Mocking.Test\Simple.Data.Mocking.Test.csproj", "{D4FE470E-4B01-4120-B809-F426A0179191}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.SqlServer", "Simple.Data.SqlServer\Simple.Data.SqlServer.csproj", "{E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.AdapterApi", "Simple.Data.AdapterApi\Simple.Data.AdapterApi.csproj", "{67ACEAD5-B457-4B52-9C55-611A61A73B56}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.Ado", "Simple.Data.Ado\Simple.Data.Ado.csproj", "{ECC2D7DB-EC7F-44B6-B09F-5B471C629685}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.Ado.Test", "Simple.Data.Ado.Test\Simple.Data.Ado.Test.csproj", "{96C623FD-869E-4DCE-98A1-17075EE384F9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.BehaviourTest", "Simple.Data.BehaviourTest\Simple.Data.BehaviourTest.csproj", "{70536BA8-AF0D-46F3-B04C-45177F56B320}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.SqlCe40", "Simple.Data.SqlCe40\Simple.Data.SqlCe40.csproj", "{43BA3D2C-10D8-470D-A60B-4F06D2F9D539}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.SqlCe40Test", "Simple.Data.SqlCe40Test\Simple.Data.SqlCe40Test.csproj", "{E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.TestHelper", "Simple.Data.TestHelper\Simple.Data.TestHelper.csproj", "{7DAB2F13-0392-435E-A934-4567266714BF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PerformanceTestConsole", "PerformanceTestConsole\PerformanceTestConsole.csproj", "{C88EA51F-59C4-4283-97AC-06440F4AA4F6}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Profiling", "Profiling", "{2AAC5DFA-3851-4324-A51F-5BC46BEB777C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProfilingApp", "ProfilingApp\ProfilingApp.csproj", "{9AAF3008-8033-4A26-93D2-97928E7801E9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.InMemoryTest", "Simple.Data.InMemoryTest\Simple.Data.InMemoryTest.csproj", "{1B6A87C0-4ACA-4411-8879-844537A52126}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|Mixed Platforms = Debug|Mixed Platforms - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|Mixed Platforms = Release|Mixed Platforms - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Debug|Any CPU.Build.0 = Debug|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Debug|x86.ActiveCfg = Debug|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release|Any CPU.ActiveCfg = Release|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release|Any CPU.Build.0 = Release|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release|x86.ActiveCfg = Release|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Debug|x86.ActiveCfg = Debug|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release|Any CPU.Build.0 = Release|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release|x86.ActiveCfg = Release|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Debug|x86.ActiveCfg = Debug|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release|Any CPU.Build.0 = Release|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release|x86.ActiveCfg = Release|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Debug|Any CPU.Build.0 = Debug|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Debug|x86.ActiveCfg = Debug|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release|Any CPU.ActiveCfg = Release|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release|Any CPU.Build.0 = Release|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release|x86.ActiveCfg = Release|Any CPU - {D4FE470E-4B01-4120-B809-F426A0179191}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D4FE470E-4B01-4120-B809-F426A0179191}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D4FE470E-4B01-4120-B809-F426A0179191}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {D4FE470E-4B01-4120-B809-F426A0179191}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {D4FE470E-4B01-4120-B809-F426A0179191}.Debug|x86.ActiveCfg = Debug|Any CPU - {D4FE470E-4B01-4120-B809-F426A0179191}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D4FE470E-4B01-4120-B809-F426A0179191}.Release|Any CPU.Build.0 = Release|Any CPU - {D4FE470E-4B01-4120-B809-F426A0179191}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {D4FE470E-4B01-4120-B809-F426A0179191}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {D4FE470E-4B01-4120-B809-F426A0179191}.Release|x86.ActiveCfg = Release|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Debug|x86.ActiveCfg = Debug|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release|Any CPU.Build.0 = Release|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release|x86.ActiveCfg = Release|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Debug|Any CPU.Build.0 = Debug|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Debug|x86.ActiveCfg = Debug|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release|Any CPU.ActiveCfg = Release|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release|Any CPU.Build.0 = Release|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release|x86.ActiveCfg = Release|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Debug|x86.ActiveCfg = Debug|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release|Any CPU.Build.0 = Release|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release|x86.ActiveCfg = Release|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Debug|x86.ActiveCfg = Debug|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release|Any CPU.Build.0 = Release|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release|x86.ActiveCfg = Release|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Debug|Any CPU.Build.0 = Debug|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Debug|x86.ActiveCfg = Debug|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release|Any CPU.ActiveCfg = Release|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release|Any CPU.Build.0 = Release|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release|x86.ActiveCfg = Release|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Debug|Any CPU.Build.0 = Debug|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Debug|x86.ActiveCfg = Debug|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release|Any CPU.ActiveCfg = Release|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release|Any CPU.Build.0 = Release|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release|x86.ActiveCfg = Release|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Debug|x86.ActiveCfg = Debug|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release|Any CPU.Build.0 = Release|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release|x86.ActiveCfg = Release|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Debug|x86.ActiveCfg = Debug|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Release|Any CPU.Build.0 = Release|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Release|x86.ActiveCfg = Release|Any CPU - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Debug|Any CPU.ActiveCfg = Debug|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Debug|x86.ActiveCfg = Debug|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Debug|x86.Build.0 = Debug|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release|Any CPU.ActiveCfg = Release|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release|Mixed Platforms.Build.0 = Release|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release|x86.ActiveCfg = Release|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release|x86.Build.0 = Release|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Debug|Any CPU.ActiveCfg = Debug|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Debug|x86.ActiveCfg = Debug|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Debug|x86.Build.0 = Debug|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release|Any CPU.ActiveCfg = Release|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release|Mixed Platforms.Build.0 = Release|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release|x86.ActiveCfg = Release|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release|x86.Build.0 = Release|x86 - {1B6A87C0-4ACA-4411-8879-844537A52126}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Debug|x86.ActiveCfg = Debug|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Release|Any CPU.Build.0 = Release|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Release|x86.ActiveCfg = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} - {D4FE470E-4B01-4120-B809-F426A0179191} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} - {96C623FD-869E-4DCE-98A1-17075EE384F9} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} - {70536BA8-AF0D-46F3-B04C-45177F56B320} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} - {1B6A87C0-4ACA-4411-8879-844537A52126} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} - {9AAF3008-8033-4A26-93D2-97928E7801E9} = {2AAC5DFA-3851-4324-A51F-5BC46BEB777C} - EndGlobalSection - GlobalSection(NDepend) = preSolution - Project = ".\Simple_Data.ndproj" - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.20827.3 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data", "Simple.Data\Simple.Data.csproj", "{148CEE80-2E84-4ABD-B5AB-20415B2BBD21}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{10F43335-5672-4BDA-91BB-5311C2BFA409}" + ProjectSection(SolutionItems) = preProject + CommonAssemblyInfo.cs = CommonAssemblyInfo.cs + README.md = README.md + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.UnitTest", "Simple.Data.UnitTest\Simple.Data.UnitTest.csproj", "{1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Assemblies", "Assemblies", "{BA656253-3472-4A47-8640-976E89465B6F}" + ProjectSection(SolutionItems) = preProject + Assemblies\sqlceca35.dll = Assemblies\sqlceca35.dll + Assemblies\sqlcecompact35.dll = Assemblies\sqlcecompact35.dll + Assemblies\sqlceer35EN.dll = Assemblies\sqlceer35EN.dll + Assemblies\sqlceme35.dll = Assemblies\sqlceme35.dll + Assemblies\sqlceoledb35.dll = Assemblies\sqlceoledb35.dll + Assemblies\sqlceqp35.dll = Assemblies\sqlceqp35.dll + Assemblies\sqlcese35.dll = Assemblies\sqlcese35.dll + Assemblies\System.Data.SqlServerCe.dll = Assemblies\System.Data.SqlServerCe.dll + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.SqlTest", "Simple.Data.SqlTest\Simple.Data.SqlTest.csproj", "{EFA5B19B-D24F-497E-AB48-8588ABFD1D01}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{182AEEFE-9B89-4264-BCED-91A00D1EF896}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.SqlServer", "Simple.Data.SqlServer\Simple.Data.SqlServer.csproj", "{E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.AdapterApi", "Simple.Data.AdapterApi\Simple.Data.AdapterApi.csproj", "{67ACEAD5-B457-4B52-9C55-611A61A73B56}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.Ado", "Simple.Data.Ado\Simple.Data.Ado.csproj", "{ECC2D7DB-EC7F-44B6-B09F-5B471C629685}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.Ado.Test", "Simple.Data.Ado.Test\Simple.Data.Ado.Test.csproj", "{96C623FD-869E-4DCE-98A1-17075EE384F9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.BehaviourTest", "Simple.Data.BehaviourTest\Simple.Data.BehaviourTest.csproj", "{70536BA8-AF0D-46F3-B04C-45177F56B320}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.SqlCe40", "Simple.Data.SqlCe40\Simple.Data.SqlCe40.csproj", "{43BA3D2C-10D8-470D-A60B-4F06D2F9D539}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.SqlCe40Test", "Simple.Data.SqlCe40Test\Simple.Data.SqlCe40Test.csproj", "{E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.TestHelper", "Simple.Data.TestHelper\Simple.Data.TestHelper.csproj", "{7DAB2F13-0392-435E-A934-4567266714BF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PerformanceTestConsole", "PerformanceTestConsole\PerformanceTestConsole.csproj", "{C88EA51F-59C4-4283-97AC-06440F4AA4F6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Profiling", "Profiling", "{2AAC5DFA-3851-4324-A51F-5BC46BEB777C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProfilingApp", "ProfilingApp\ProfilingApp.csproj", "{9AAF3008-8033-4A26-93D2-97928E7801E9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.InMemoryTest", "Simple.Data.InMemoryTest\Simple.Data.InMemoryTest.csproj", "{1B6A87C0-4ACA-4411-8879-844537A52126}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.Mocking", "Simple.Data.Mocking\Simple.Data.Mocking.csproj", "{292611F6-BBBD-492D-891C-0D9FB4BF5433}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms + Release|x86 = Release|x86 + Release-Mono|Any CPU = Release-Mono|Any CPU + Release-Mono|Mixed Platforms = Release-Mono|Mixed Platforms + Release-Mono|x86 = Release-Mono|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Debug|Any CPU.Build.0 = Debug|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Debug|x86.ActiveCfg = Debug|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release|Any CPU.ActiveCfg = Release|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release|Any CPU.Build.0 = Release|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release|x86.ActiveCfg = Release|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Debug|x86.ActiveCfg = Debug|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release|Any CPU.Build.0 = Release|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release|x86.ActiveCfg = Release|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Debug|x86.ActiveCfg = Debug|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release|Any CPU.Build.0 = Release|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release|x86.ActiveCfg = Release|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Debug|x86.ActiveCfg = Debug|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release|Any CPU.Build.0 = Release|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release|x86.ActiveCfg = Release|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Debug|Any CPU.Build.0 = Debug|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Debug|x86.ActiveCfg = Debug|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release|Any CPU.ActiveCfg = Release|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release|Any CPU.Build.0 = Release|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release|x86.ActiveCfg = Release|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release-Mono|Any CPU.ActiveCfg = Release|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release-Mono|Any CPU.Build.0 = Release|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release-Mono|Mixed Platforms.ActiveCfg = Release|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release-Mono|Mixed Platforms.Build.0 = Release|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release-Mono|x86.ActiveCfg = Release|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Debug|x86.ActiveCfg = Debug|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release|Any CPU.Build.0 = Release|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release|x86.ActiveCfg = Release|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Debug|x86.ActiveCfg = Debug|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release|Any CPU.Build.0 = Release|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release|x86.ActiveCfg = Release|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Debug|x86.ActiveCfg = Debug|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release|Any CPU.ActiveCfg = Release|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release|Any CPU.Build.0 = Release|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release|x86.ActiveCfg = Release|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Debug|Any CPU.Build.0 = Debug|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Debug|x86.ActiveCfg = Debug|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release|Any CPU.ActiveCfg = Release|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release|Any CPU.Build.0 = Release|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release|x86.ActiveCfg = Release|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release-Mono|Any CPU.ActiveCfg = Release|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release-Mono|Any CPU.Build.0 = Release|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release-Mono|Mixed Platforms.ActiveCfg = Release|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release-Mono|Mixed Platforms.Build.0 = Release|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release-Mono|x86.ActiveCfg = Release|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Debug|x86.ActiveCfg = Debug|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release|Any CPU.Build.0 = Release|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release|x86.ActiveCfg = Release|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release-Mono|Any CPU.ActiveCfg = Release|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release-Mono|Any CPU.Build.0 = Release|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release-Mono|Mixed Platforms.ActiveCfg = Release|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release-Mono|Mixed Platforms.Build.0 = Release|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release-Mono|x86.ActiveCfg = Release|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Debug|x86.ActiveCfg = Debug|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Release|Any CPU.Build.0 = Release|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Release|x86.ActiveCfg = Release|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Debug|Any CPU.ActiveCfg = Debug|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Debug|x86.ActiveCfg = Debug|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Debug|x86.Build.0 = Debug|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release|Any CPU.ActiveCfg = Release|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release|Mixed Platforms.Build.0 = Release|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release|x86.ActiveCfg = Release|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release|x86.Build.0 = Release|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release-Mono|Any CPU.ActiveCfg = Release|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release-Mono|Mixed Platforms.ActiveCfg = Release|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release-Mono|Mixed Platforms.Build.0 = Release|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release-Mono|x86.ActiveCfg = Release|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release-Mono|x86.Build.0 = Release|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Debug|Any CPU.ActiveCfg = Debug|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Debug|x86.ActiveCfg = Debug|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Debug|x86.Build.0 = Debug|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release|Any CPU.ActiveCfg = Release|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release|Mixed Platforms.Build.0 = Release|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release|x86.ActiveCfg = Release|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release|x86.Build.0 = Release|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release-Mono|Any CPU.ActiveCfg = Release|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release-Mono|Mixed Platforms.ActiveCfg = Release|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release-Mono|Mixed Platforms.Build.0 = Release|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release-Mono|x86.ActiveCfg = Release|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release-Mono|x86.Build.0 = Release|x86 + {1B6A87C0-4ACA-4411-8879-844537A52126}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Debug|x86.ActiveCfg = Debug|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Release|Any CPU.Build.0 = Release|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Release|x86.ActiveCfg = Release|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Debug|Any CPU.Build.0 = Debug|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Debug|x86.ActiveCfg = Debug|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release|Any CPU.ActiveCfg = Release|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release|Any CPU.Build.0 = Release|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release|x86.ActiveCfg = Release|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} + {96C623FD-869E-4DCE-98A1-17075EE384F9} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} + {70536BA8-AF0D-46F3-B04C-45177F56B320} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} + {1B6A87C0-4ACA-4411-8879-844537A52126} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} + {9AAF3008-8033-4A26-93D2-97928E7801E9} = {2AAC5DFA-3851-4324-A51F-5BC46BEB777C} + EndGlobalSection + GlobalSection(NDepend) = preSolution + Project = ".\Simple_Data.ndproj" + EndGlobalSection +EndGlobal diff --git a/Simple.Data/Adapter.cs b/Simple.Data/Adapter.cs index 9d3a1f1b..e6b622a2 100644 --- a/Simple.Data/Adapter.cs +++ b/Simple.Data/Adapter.cs @@ -1,608 +1,310 @@ -namespace Simple.Data -{ - using System; - using System.Collections.Generic; - using System.Dynamic; - using System.Linq; - using Extensions; - - ///

- /// Provides a base class for adapters to persist data to data storage systems. - /// Authors may derive from this class to create support for all kinds of databases or data stores. - /// - public abstract class Adapter - { - private readonly ExpandoObject _settings = new ExpandoObject(); - - /// - /// Gets an with the settings for this . - /// This property may be cast to an with a - /// key and value for non-dynamic access. - /// - /// The settings. - protected dynamic Settings - { - get { return _settings; } - } - - /// - /// Performs initial setup of the Adapter, allowing an object to be passed in with Adapter-specific settings. - /// - /// An or an anonymous-typed object with any adapter-specific settings. - public void Setup(object settings) - { - Setup(settings.ObjectToDictionary()); - } - - /// - /// Performs initial setup of the Adapter, allowing an object to be passed in with Adapter-specific settings. - /// - /// A list of name/value pairs with any adapter-specific settings. - public void Setup(IEnumerable> settings) - { - var settingsAsDictionary = (IDictionary) _settings; - foreach (var keyValuePair in settings) - { - settingsAsDictionary.Add(keyValuePair); - } - - OnSetup(); - } - - public OptionsBase Options { get; set; } - - /// - /// Called when the method is called, after the settings have been set. - /// - /// It is not necessary to call base.OnSetup() when overriding this method. - protected virtual void OnSetup() - { - } - - /// - /// Gets the key value(s) for the record. - /// - /// Name of the table. - /// The record. - /// An IDictionary<string,object> containing the key that uniquely identifies the record in the database. - public abstract IDictionary GetKey(string tableName, IDictionary record); - - /// - /// Gets the key name(s) for the table. - /// - /// Name of the table. - /// An IList<string> containing the key names that uniquely identify a record in the database. - public abstract IList GetKeyNames(string tableName); - - /// - /// Gets a single record from the specified "table" using its default key. - /// - /// Name of the table. - /// The values to search with. - /// The record matching the supplied key. If no record is found, return null. - public abstract IDictionary Get(string tableName, params object[] keyValues); - - /// - /// Finds data from the specified "table". - /// - /// Name of the table. - /// The criteria. This may be null, in which case all records should be returned. - /// The list of records matching the criteria. If no records are found, return an empty list. - public abstract IEnumerable> Find(string tableName, SimpleExpression criteria); - - /// - /// Runs a . - /// - /// The to run. - /// Use this to return any clauses your adapter is unable to interpret. - /// - public abstract IEnumerable> RunQuery(SimpleQuery query, - out IEnumerable - unhandledClauses); - - /// - /// Inserts a record into the specified "table". - /// Name of the table. - /// The values to insert. - /// true if the insert call uses a return value; otherwise, false. - /// If possible, return the newly inserted row, including any automatically-set values such as primary keys or timestamps. - public abstract IDictionary Insert(string tableName, IDictionary data, bool resultRequired); - - /// - /// Updates the specified "table" according to specified criteria. - /// - /// Name of the table. - /// The new values. - /// The expression to use as criteria for the update operation. - /// The number of records affected by the update operation. - public abstract int Update(string tableName, IDictionary data, SimpleExpression criteria); - - /// - /// Deletes from the specified table. - /// Name of the table. - /// The expression to use as criteria for the delete operation. - /// The number of records which were deleted. - public abstract int Delete(string tableName, SimpleExpression criteria); - - /// - /// Checks to see whether the passed function name is a valid function for the Adapter. - /// - /// The name of the function. - /// The values passed (for overload resolution etc). - /// true if the name represents a function; otherwise, false. - public abstract bool IsExpressionFunction(string functionName, params object[] args); - - /// - /// Finds a single record. - /// - /// Name of the table. - /// The criteria. - /// A dictionary containing the record. - /// This method has a default implementation based on the method. - /// You should override this method if your adapter can optimize the operation. - public virtual IDictionary FindOne(string tableName, SimpleExpression criteria) - { - return Find(tableName, criteria).FirstOrDefault(); - } - - /// - /// Inserts multiple records into a table. - /// - /// Name of the table. - /// The data. - /// A Func to call when there is an error. It this func returns true, carry on, otherwise abort. - /// true if the result of the insert is used in code; otherwise, false. - /// If possible, return the newly inserted rows, including any automatically-set values such as primary keys or timestamps. - /// This method has a default implementation based on the method. - /// You should override this method if your adapter can optimize the operation. - public virtual IEnumerable> InsertMany(string tableName, - IEnumerable> dataList, - Func, Exception, bool> onError, - bool resultRequired) - { - if (resultRequired) - { - return InsertManyAndReturn(tableName, dataList, onError); - } - InsertManyWithoutReturn(tableName, dataList, onError); - return null; - } - - private IEnumerable> InsertManyAndReturn(string tableName, IEnumerable> dataList, Func, Exception, bool> onError) - { - foreach (var row in dataList) - { - IDictionary inserted; - try - { - inserted = Insert(tableName, row, true); - } - catch (Exception ex) - { - if (onError != null) - { - if (onError(row, ex)) - { - continue; - } - break; - } - throw; - } - yield return inserted; - } - } - - private void InsertManyWithoutReturn(string tableName, IEnumerable> dataList, Func, Exception, bool> onError) - { - foreach (var row in dataList) - { - try - { - Insert(tableName, row, false); - } - catch (Exception ex) - { - if (onError != null) - { - if (onError(row, ex)) - { - continue; - } - break; - } - throw; - } - } - } - - /// - /// Updates multiple records in a table. - /// - /// Name of the table. - /// The data. - /// The total number of records affected by the update operations. - /// This method has a default implementation based on the method. - /// You should override this method if your adapter can optimize the operation. - public virtual int UpdateMany(string tableName, IEnumerable> data) - { - int updateCount = 0; - foreach (var row in data) - { - var key = GetKey(tableName, row); - var criteria = ExpressionHelper.CriteriaDictionaryToExpression(tableName, key); - updateCount += Update(tableName, row, criteria); - } - return updateCount; - } - - /// - /// Runs the query as an , for Reactive Extension joy. - /// - /// The query. - /// The unhandled clauses. - /// A cold which will start pushing when subscribed. - /// This method has a default implementation based on the method. - /// You should override this method if your adapter can optimize the operation. - public virtual IObservable> RunQueryAsObservable(SimpleQuery query, - out - IEnumerable - - unhandledClauses) - { - return RunQuery(query, out unhandledClauses).ToObservable(); - } - - /// - /// Runs multiple queries. - /// - /// The queries. - /// The unhandled clauses. - /// A list of lists of dictionaries. Data. - /// This method has a default implementation based on the method. - /// You should override this method if your adapter can optimize the operation. - public virtual IEnumerable>> RunQueries(SimpleQuery[] queries, - List - < - IEnumerable - > - unhandledClauses) - { - foreach (var query in queries) - { - IEnumerable unhandledClausesForThisQuery; - var result = RunQuery(query, out unhandledClausesForThisQuery); - unhandledClauses.Add(unhandledClausesForThisQuery); - yield return result; - } - } - - /// - /// Updates the specified "table" according to default keys (to be handled by adapter). - /// - /// Name of the table. - /// A list of objects to be updated. - /// The list of field names to be used for criteria. - /// The number of records affected by the update operation. - /// For example, the Ado adapter will fulfil this functionality using Primary Key data. - /// This method has a default implementation based on the - /// method. - /// You should override this method if your adapter can optimize the operation. - public virtual int UpdateMany(string tableName, IEnumerable> dataList, - IEnumerable criteriaFieldNames) - { - int updatedCount = 0; - var criteriaFieldNameList = criteriaFieldNames.ToList(); - foreach (var data in dataList) - { - updatedCount += Update(tableName, data, GetCriteria(tableName, criteriaFieldNameList, data)); - } - return updatedCount; - } - - /// - /// Creates a delegate which can accept an array of values to use as criteria against a cached template. - /// When called, the delegate should return a single record using the passed values as criteria. - /// Name of the table. - /// The criteria to use as a template for the delegate - /// A Func<object[], IDictionary<string, object>>" which finds a record. - public virtual Func> CreateFindOneDelegate(string tableName, - SimpleExpression criteria) - { - throw new NotImplementedException(); - } - - /// - /// Creates a delegate which can accept an array of values to use as criteria against a cached template. - /// When called, the delegate should return zero or more records using the passed values as criteria. - /// Name of the table. - /// The criteria to use as a template for the delegate - /// A Func<object[], IDictionary<string, object>>" which finds a record. - public virtual Func>> CreateFindDelegate(string tableName, - SimpleExpression - criteria) - { - throw new NotImplementedException(); - } - - /// - /// Creates a criteria expression. - /// - /// The name of the root table for the expression. - /// The names of fields to be used for the criteria. - /// The name/value pairs to be used as criteria. - /// A criteria object. - protected static SimpleExpression GetCriteria(string tableName, IEnumerable criteriaFieldNames, - IDictionary record) - { - var criteria = new Dictionary(); - - foreach (var criteriaFieldName in criteriaFieldNames) - { - var name = criteriaFieldName; - var keyValuePair = record.SingleOrDefault(kvp => kvp.Key.Homogenize().Equals(name.Homogenize())); - if (string.IsNullOrWhiteSpace(keyValuePair.Key)) - { - throw new InvalidOperationException("Key field value not set."); - } - - criteria.Add(criteriaFieldName, keyValuePair.Value); - record.Remove(keyValuePair); - } - return ExpressionHelper.CriteriaDictionaryToExpression(tableName, criteria); - } - - public void Reset() - { - OnReset(); - } - - protected virtual void OnReset() - { - } - - private OptimizingDelegateFactory _optimizingDelegateFactory; - - public OptimizingDelegateFactory OptimizingDelegateFactory - { - get { return _optimizingDelegateFactory ?? (_optimizingDelegateFactory = CreateOptimizingDelegateFactory()); } - } - - private OptimizingDelegateFactory CreateOptimizingDelegateFactory() - { - return MefHelper.GetAdjacentComponent(GetType()) ?? new DefaultOptimizingDelegateFactory(); - } - - public virtual IDictionary Upsert(string tableName, IDictionary dict, SimpleExpression criteriaExpression, bool isResultRequired) - { - if (Find(tableName, criteriaExpression).Any()) - { - var key = GetKey(tableName, dict); - dict = dict.Where(kvp => key.All(keyKvp => keyKvp.Key.Homogenize() != kvp.Key.Homogenize())).ToDictionary(); - Update(tableName, dict, criteriaExpression); - return isResultRequired ? Find(tableName, criteriaExpression).FirstOrDefault() : null; - } - - return Insert(tableName, dict, isResultRequired); - } - - public virtual IEnumerable> UpsertMany(string tableName, IList> list, IEnumerable keyFieldNames, bool isResultRequired, Func,Exception,bool> errorCallback) - { - if (isResultRequired) - return UpsertManyWithResults(tableName, list, keyFieldNames, errorCallback); - UpsertManyWithoutResults(tableName, list, keyFieldNames, errorCallback); - return null; - } - - private IEnumerable> UpsertManyWithResults(string tableName, IEnumerable> list, IEnumerable keyFieldNames, - Func, Exception, bool> errorCallback) - { - var criteriaFields = keyFieldNames.ToArray(); - foreach (var row in list) - { - IDictionary result; - try - { - var criteria = GetCriteria(tableName, criteriaFields, row); - result = Upsert(tableName, row, criteria, true); - } - catch (Exception ex) - { - if (errorCallback(row, ex)) continue; - throw; - } - yield return result; - } - } - - private void UpsertManyWithoutResults(string tableName, IEnumerable> list, IEnumerable keyFieldNames, - Func, Exception, bool> errorCallback) - { - var criteriaFields = keyFieldNames.ToArray(); - foreach (var row in list) - { - try - { - var criteria = GetCriteria(tableName, criteriaFields, row); - Upsert(tableName, row, criteria, false); - } - catch (Exception ex) - { - if (errorCallback(row, ex)) continue; - throw; - } - } - } - - public virtual IDictionary Upsert(string tableName, IDictionary dict, SimpleExpression criteriaExpression, bool isResultRequired, IAdapterTransaction transaction) - { - var transactionAdapter = this as IAdapterWithTransactions; - if (transactionAdapter == null) throw new NotSupportedException("Transactions are not supported with current adapter."); - if (transactionAdapter.Find(tableName, criteriaExpression, transaction).Any()) - { - transactionAdapter.Update(tableName, dict, criteriaExpression, transaction); - return isResultRequired ? transactionAdapter.Find(tableName, criteriaExpression, transaction).FirstOrDefault() : null; - } - - return transactionAdapter.Insert(tableName, dict, transaction, isResultRequired); - } - - public virtual IEnumerable> UpsertMany(string tableName, IList> list, IEnumerable keyFieldNames, IAdapterTransaction transaction, bool isResultRequired, Func,Exception,bool> errorCallback) - { - var transactionAdapter = this as IAdapterWithTransactions; - if (transactionAdapter == null) throw new NotSupportedException("Transactions are not supported with current adapter."); - - var criteriaFields = keyFieldNames.ToArray(); - if (isResultRequired) - { - return UpsertManyWithResults(tableName, list, transaction, transactionAdapter, criteriaFields, errorCallback); - } - - UpsertManyWithoutResults(tableName, list, transaction, transactionAdapter, criteriaFields, errorCallback); - return null; - } - - private static IEnumerable> UpsertManyWithResults(string tableName, IEnumerable> list, IAdapterTransaction transaction, IAdapterWithTransactions transactionAdapter, string[] criteriaFields, Func, Exception, bool> errorCallback) - { - foreach (var row in list) - { - IDictionary result; - - try - { - var criteria = GetCriteria(tableName, criteriaFields, row); - result = transactionAdapter.Upsert(tableName, row, criteria, true, transaction); - } - catch (Exception ex) - { - if (errorCallback(row, ex)) - { - continue; - } - throw; - } - - yield return result; - } - } - - private static void UpsertManyWithoutResults(string tableName, IEnumerable> list, IAdapterTransaction transaction, IAdapterWithTransactions transactionAdapter, string[] criteriaFields, Func, Exception, bool> errorCallback) - { - foreach (var row in list) - { - var criteria = GetCriteria(tableName, criteriaFields, row); - try - { - transactionAdapter.Upsert(tableName, row, criteria, true, transaction); - } - catch (Exception ex) - { - if (errorCallback(row, ex)) - { - continue; - } - throw; - } - } - } - - public virtual IEnumerable> UpsertMany(string tableName, IList> list, bool isResultRequired, Func,Exception,bool> errorCallback) - { - if (isResultRequired) - { - return UpsertManyWithResults(tableName, list, errorCallback); - } - UpsertManyWithoutResults(tableName, list, errorCallback); - return null; - } - - private IEnumerable> UpsertManyWithResults(string tableName, IEnumerable> list, Func, Exception, bool> errorCallback) - { - foreach (var row in list) - { - IDictionary result; - try - { - var key = GetKey(tableName, row); - var criteria = ExpressionHelper.CriteriaDictionaryToExpression(tableName, key); - if (Find(tableName, criteria).Any()) - { - var record = row.Except(key).ToDictionary(); - Update(tableName, record, criteria); - result = FindOne(tableName, criteria); - } - else - { - result = Insert(tableName, row, true); - } - } - catch (Exception ex) - { - if (errorCallback(row, ex)) - { - continue; - } - throw; - } - yield return result; - } - } - - private void UpsertManyWithoutResults(string tableName, IEnumerable> list, Func, Exception, bool> errorCallback) - { - foreach (var row in list) - { - try - { - var key = GetKey(tableName, row); - var criteria = ExpressionHelper.CriteriaDictionaryToExpression(tableName, key); - if (Find(tableName, criteria).Any()) - { - var record = row.Except(key).ToDictionary(); - Update(tableName, record, criteria); - } - else - { - Insert(tableName, row, false); - } - } - catch (Exception ex) - { - if (!errorCallback(row, ex)) throw; - } - } - } - - public virtual IEnumerable> UpsertMany(string tableName, IList> list, IAdapterTransaction transaction, bool isResultRequired, Func,Exception,bool> errorCallback) - { - var transactionAdapter = this as IAdapterWithTransactions; - if (transactionAdapter == null) throw new NotSupportedException("Transactions are not supported with current adapter."); - - foreach (var row in list) - { - IDictionary result; - try - { - var key = GetKey(tableName, row); - var criteria = ExpressionHelper.CriteriaDictionaryToExpression(tableName, key); - if (transactionAdapter.Find(tableName, criteria, transaction).Any()) - { - var record = row.Except(key).ToDictionary(); - transactionAdapter.Update(tableName, record, criteria, transaction); - result = isResultRequired ? transactionAdapter.Find(tableName, criteria, transaction).FirstOrDefault() : null; - } - else - { - result = transactionAdapter.Insert(tableName, row, transaction, isResultRequired); - } - } - catch (Exception ex) - { - if (errorCallback(row, ex)) continue; - throw; - } - yield return result; - } - } - } +using Simple.Data.Operations; + +namespace Simple.Data +{ + using System; + using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.Dynamic; + using System.Linq; + using Extensions; + + /// + /// Provides a base class for adapters to persist data to data storage systems. + /// Authors may derive from this class to create support for all kinds of databases or data stores. + /// + public abstract class Adapter + { + private readonly ExpandoObject _settings = new ExpandoObject(); + + /// + /// Gets an with the settings for this . + /// This property may be cast to an with a + /// key and value for non-dynamic access. + /// + /// The settings. + protected dynamic Settings + { + get { return _settings; } + } + + /// + /// Performs initial setup of the Adapter, allowing an object to be passed in with Adapter-specific settings. + /// + /// An or an anonymous-typed object with any adapter-specific settings. + public void Setup(object settings) + { + Setup(settings.ObjectToDictionary()); + } + + /// + /// Performs initial setup of the Adapter, allowing an object to be passed in with Adapter-specific settings. + /// + /// A list of name/value pairs with any adapter-specific settings. + public void Setup(IEnumerable> settings) + { + var settingsAsDictionary = (IDictionary) _settings; + foreach (var keyValuePair in settings) + { + settingsAsDictionary.Add(keyValuePair); + } + + OnSetup(); + } + + public OptionsBase Options { get; set; } + + /// + /// Called when the method is called, after the settings have been set. + /// + /// It is not necessary to call base.OnSetup() when overriding this method. + protected virtual void OnSetup() + { + } + + /// + /// Gets the key value(s) for the record. + /// + /// Name of the table. + /// The record. + /// An IDictionary<string,object> containing the key that uniquely identifies the record in the database. + public abstract IReadOnlyDictionary GetKey(string tableName, IReadOnlyDictionary record); + + /// + /// Gets the key name(s) for the table. + /// + /// Name of the table. + /// An IList<string> containing the key names that uniquely identify a record in the database. + public abstract IList GetKeyNames(string tableName); + + /// + /// Gets a single record from the specified "table" using its default key. + /// + /// Operation object with details of operation. + /// The record matching the supplied key. If no record is found, return null. + public abstract IReadOnlyDictionary Get(GetOperation operation); + + /// + /// Finds data from the specified "table". + /// + /// Operation details. + /// The list of records matching the criteria. If no records are found, return an empty list. + public abstract IEnumerable> Find(FindOperation operation); + + /// + /// Runs a . + /// + /// The to run. + /// Use this to return any clauses your adapter is unable to interpret. + /// + public abstract IEnumerable> RunQuery(SimpleQuery query, + out IEnumerable + unhandledClauses); + + /// + /// Inserts a record into the specified "table". + /// + /// Operation details. + /// If possible and required, return the newly inserted row(s), including any automatically-set values such as primary keys or timestamps. + public abstract IEnumerable> Insert(InsertOperation operation); + + /// + /// Updates the specified "table" according to specified criteria. + /// + /// Name of the table. + /// The new values. + /// The expression to use as criteria for the update operation. + /// The number of records affected by the update operation. + public abstract int Update(string tableName, IReadOnlyDictionary data, SimpleExpression criteria); + + /// + /// Deletes from the specified table. + /// Name of the table. + /// The expression to use as criteria for the delete operation. + /// The number of records which were deleted. + public abstract int Delete(string tableName, SimpleExpression criteria); + + /// + /// Checks to see whether the passed function name is a valid function for the Adapter. + /// + /// The name of the function. + /// The values passed (for overload resolution etc). + /// true if the name represents a function; otherwise, false. + public abstract bool IsExpressionFunction(string functionName, params object[] args); + + /// + /// Finds a single record. + /// + /// Operation details. + /// A dictionary containing the record. + /// This method has a default implementation based on the method. + /// You should override this method if your adapter can optimize the operation. + public virtual IReadOnlyDictionary FindOne(FindOperation operation) + { + return Find(operation).FirstOrDefault(); + } + + /// + /// Updates multiple records in a table. + /// + /// Name of the table. + /// The data. + /// The total number of records affected by the update operations. + /// This method has a default implementation based on the method. + /// You should override this method if your adapter can optimize the operation. + public virtual int UpdateMany(string tableName, IEnumerable> data) + { + int updateCount = 0; + foreach (var row in data) + { + var key = GetKey(tableName, row); + var criteria = ExpressionHelper.CriteriaDictionaryToExpression(tableName, key); + updateCount += Update(tableName, row, criteria); + } + return updateCount; + } + + /// + /// Runs the query as an , for Reactive Extension joy. + /// + /// The query. + /// The unhandled clauses. + /// A cold which will start pushing when subscribed. + /// This method has a default implementation based on the method. + /// You should override this method if your adapter can optimize the operation. + public virtual IObservable> RunQueryAsObservable(SimpleQuery query, + out + IEnumerable + + unhandledClauses) + { + return RunQuery(query, out unhandledClauses).ToObservable(); + } + + /// + /// Runs multiple queries. + /// + /// The queries. + /// The unhandled clauses. + /// A list of lists of dictionaries. Data. + /// This method has a default implementation based on the method. + /// You should override this method if your adapter can optimize the operation. + public virtual IEnumerable>> RunQueries(SimpleQuery[] queries, + List + < + IEnumerable + > + unhandledClauses) + { + foreach (var query in queries) + { + IEnumerable unhandledClausesForThisQuery; + var result = RunQuery(query, out unhandledClausesForThisQuery); + unhandledClauses.Add(unhandledClausesForThisQuery); + yield return result; + } + } + + /// + /// Updates the specified "table" according to default keys (to be handled by adapter). + /// + /// Name of the table. + /// A list of objects to be updated. + /// The list of field names to be used for criteria. + /// The number of records affected by the update operation. + /// For example, the Ado adapter will fulfil this functionality using Primary Key data. + /// This method has a default implementation based on the + /// method. + /// You should override this method if your adapter can optimize the operation. + public virtual int UpdateMany(string tableName, IEnumerable> dataList, + IEnumerable criteriaFieldNames) + { + int updatedCount = 0; + var criteriaFieldNameList = criteriaFieldNames.ToList(); + foreach (var data in dataList) + { + var modified = data; + var criteria = GetCriteria(tableName, criteriaFieldNameList, ref modified); + updatedCount += Update(tableName, modified, criteria); + } + return updatedCount; + } + + /// + /// Creates a delegate which can accept an array of values to use as criteria against a cached template. + /// When called, the delegate should return a single record using the passed values as criteria. + /// Name of the table. + /// The criteria to use as a template for the delegate + /// A Func<object[], IDictionary<string, object>>" which finds a record. + public virtual Func> CreateFindOneDelegate(string tableName, + SimpleExpression criteria) + { + throw new NotImplementedException(); + } + + /// + /// Creates a delegate which can accept an array of values to use as criteria against a cached template. + /// When called, the delegate should return zero or more records using the passed values as criteria. + /// Name of the table. + /// The criteria to use as a template for the delegate + /// A Func<object[], IDictionary<string, object>>" which finds a record. + public virtual Func>> CreateFindDelegate(string tableName, + SimpleExpression + criteria) + { + throw new NotImplementedException(); + } + + /// + /// Creates a criteria expression. + /// + /// The name of the root table for the expression. + /// The names of fields to be used for the criteria. + /// The name/value pairs to be used as criteria. + /// A criteria object. + protected static SimpleExpression GetCriteria(string tableName, IEnumerable criteriaFieldNames, + ref IReadOnlyDictionary record) + { + var criteria = new Dictionary(); + var data = record.ToDictionary(); + + foreach (var criteriaFieldName in criteriaFieldNames) + { + var name = criteriaFieldName; + var keyValuePair = record.SingleOrDefault(kvp => kvp.Key.Homogenize().Equals(name.Homogenize())); + if (string.IsNullOrWhiteSpace(keyValuePair.Key)) + { + throw new InvalidOperationException("Key field value not set."); + } + + criteria.Add(criteriaFieldName, keyValuePair.Value); + data.Remove(keyValuePair); + } + record = new ReadOnlyDictionary(data); + return ExpressionHelper.CriteriaDictionaryToExpression(tableName, criteria); + } + + public void Reset() + { + OnReset(); + } + + protected virtual void OnReset() + { + } + + private OptimizingDelegateFactory _optimizingDelegateFactory; + + public OptimizingDelegateFactory OptimizingDelegateFactory + { + get { return _optimizingDelegateFactory ?? (_optimizingDelegateFactory = CreateOptimizingDelegateFactory()); } + } + + private OptimizingDelegateFactory CreateOptimizingDelegateFactory() + { + return MefHelper.GetAdjacentComponent(GetType()) ?? new DefaultOptimizingDelegateFactory(); + } + + public abstract IEnumerable> Upsert(UpsertOperation operation); + } } \ No newline at end of file diff --git a/Simple.Data/BinderHelper.cs b/Simple.Data/BinderHelper.cs index e41e6303..480d781d 100644 --- a/Simple.Data/BinderHelper.cs +++ b/Simple.Data/BinderHelper.cs @@ -10,44 +10,44 @@ namespace Simple.Data { static class BinderHelper { - private static IDictionary NamedArgumentsToDictionary(IEnumerable argumentNames, IEnumerable args) + private static IReadOnlyDictionary NamedArgumentsToDictionary(IEnumerable argumentNames, IEnumerable args) { return argumentNames .Reverse() .Zip(args.Reverse(), (k, v) => new KeyValuePair(k, v)) .Reverse() - .ToDictionary(StringComparer.InvariantCultureIgnoreCase); + .ToReadOnlyDictionary(StringComparer.InvariantCultureIgnoreCase); } - private static IDictionary ArgumentsToDictionary(IEnumerable argumentNames, IEnumerable args) + private static IReadOnlyDictionary ArgumentsToDictionary(IEnumerable argumentNames, IEnumerable args) { var argsArray = args.ToArray(); if (argsArray.Length == 1 && argsArray[0] is IDictionary) - return (IDictionary)argsArray[0]; + return (IReadOnlyDictionary)argsArray[0]; return argsArray.Reverse() .Zip(argumentNames.Reverse().ExtendInfinite(), (v, k) => new KeyValuePair(k, v)) .Reverse() .Select((kvp, i) => kvp.Key == null ? new KeyValuePair("_" + i.ToString(), kvp.Value ?? DBNull.Value) : kvp) - .ToDictionary(StringComparer.InvariantCultureIgnoreCase); + .ToReadOnlyDictionary(StringComparer.InvariantCultureIgnoreCase); } - internal static IDictionary NamedArgumentsToDictionary(this InvokeMemberBinder binder, IEnumerable args) + internal static IReadOnlyDictionary NamedArgumentsToDictionary(this InvokeMemberBinder binder, IEnumerable args) { return NamedArgumentsToDictionary(binder.CallInfo.ArgumentNames, args); } - public static IDictionary ArgumentsToDictionary(this InvokeMemberBinder binder, IEnumerable args) + public static IReadOnlyDictionary ArgumentsToDictionary(this InvokeMemberBinder binder, IEnumerable args) { return ArgumentsToDictionary(binder.CallInfo.ArgumentNames, args); } - internal static IDictionary NamedArgumentsToDictionary(this InvokeBinder binder, IEnumerable args) + internal static IReadOnlyDictionary NamedArgumentsToDictionary(this InvokeBinder binder, IEnumerable args) { return NamedArgumentsToDictionary(binder.CallInfo.ArgumentNames, args); } - public static IDictionary ArgumentsToDictionary(this InvokeBinder binder, IEnumerable args) + public static IReadOnlyDictionary ArgumentsToDictionary(this InvokeBinder binder, IEnumerable args) { return ArgumentsToDictionary(binder.CallInfo.ArgumentNames, args); } diff --git a/Simple.Data/Commands/ArgumentHelper.cs b/Simple.Data/Commands/ArgumentHelper.cs index 492eaa5f..0ac80640 100644 --- a/Simple.Data/Commands/ArgumentHelper.cs +++ b/Simple.Data/Commands/ArgumentHelper.cs @@ -1,50 +1,50 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Simple.Data.Commands -{ - using System.Dynamic; - using Extensions; - - internal static class ArgumentHelper - { - internal static void CheckFindArgs(object[] args, InvokeMemberBinder binder) - { - if (args.Length == 0) throw new ArgumentException(binder.Name + "requires arguments."); - if (args.Length == 1) - { - if (ReferenceEquals(args[0], null) && binder.CallInfo.ArgumentNames.Count == 0) - throw new ArgumentException(binder.Name + " does not accept unnamed null argument."); - } - } - - internal static IEnumerable> CreateCriteriaDictionary(InvokeMemberBinder binder, IList args, params string[] exactNames) - { - IDictionary criteriaDictionary = null; - if (exactNames.Contains(binder.Name)) - { - if (binder.CallInfo.ArgumentNames != null && binder.CallInfo.ArgumentNames.Count > 0) - { - criteriaDictionary = binder.NamedArgumentsToDictionary(args); - } - else if (args.Count == 1) - { - if (ReferenceEquals(args[0], null)) throw new ArgumentException("FindBy does not accept unnamed null argument."); - criteriaDictionary = args[0].ObjectToDictionary(); - } - } - else - { - criteriaDictionary = MethodNameParser.ParseFromBinder(binder, args); - } - - if (criteriaDictionary == null || criteriaDictionary.Count == 0) - { - throw new ArgumentException(binder.Name + " requires an equal number of column names and values to filter data by."); - } - return criteriaDictionary; - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Simple.Data.Commands +{ + using System.Dynamic; + using Extensions; + + internal static class ArgumentHelper + { + internal static void CheckFindArgs(object[] args, InvokeMemberBinder binder) + { + if (args.Length == 0) throw new ArgumentException(binder.Name + "requires arguments."); + if (args.Length == 1) + { + if (ReferenceEquals(args[0], null) && binder.CallInfo.ArgumentNames.Count == 0) + throw new ArgumentException(binder.Name + " does not accept unnamed null argument."); + } + } + + internal static IEnumerable> CreateCriteriaDictionary(InvokeMemberBinder binder, IList args, params string[] exactNames) + { + IReadOnlyDictionary criteriaDictionary = null; + if (exactNames.Contains(binder.Name)) + { + if (binder.CallInfo.ArgumentNames != null && binder.CallInfo.ArgumentNames.Count > 0) + { + criteriaDictionary = binder.NamedArgumentsToDictionary(args); + } + else if (args.Count == 1) + { + if (ReferenceEquals(args[0], null)) throw new ArgumentException("FindBy does not accept unnamed null argument."); + criteriaDictionary = args[0].ObjectToDictionary(); + } + } + else + { + criteriaDictionary = MethodNameParser.ParseFromBinder(binder, args); + } + + if (criteriaDictionary == null || criteriaDictionary.Count == 0) + { + throw new ArgumentException(binder.Name + " requires an equal number of column names and values to filter data by."); + } + return criteriaDictionary; + } + } +} diff --git a/Simple.Data/Commands/DeleteByCommand.cs b/Simple.Data/Commands/DeleteByCommand.cs index 2167c5bc..abbec91d 100644 --- a/Simple.Data/Commands/DeleteByCommand.cs +++ b/Simple.Data/Commands/DeleteByCommand.cs @@ -1,43 +1,43 @@ -using System; -using System.Collections.Generic; -using System.Dynamic; - -namespace Simple.Data.Commands -{ - using Extensions; - - class DeleteByCommand : ICommand - { - public bool IsCommandFor(string method) - { - return method.Equals("delete", StringComparison.InvariantCultureIgnoreCase) || method.StartsWith("deleteby", StringComparison.InvariantCultureIgnoreCase); - } - - public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) - { - SimpleExpression criteriaExpression = GetCriteriaExpression(binder, args, table); - return dataStrategy.Run.Delete(table.GetQualifiedName(), criteriaExpression); - } - - private static SimpleExpression GetCriteriaExpression(InvokeMemberBinder binder, object[] args, DynamicTable table) - { - IDictionary criteria; - if (binder.Name.Equals("delete", StringComparison.InvariantCultureIgnoreCase)) - { - criteria = binder.NamedArgumentsToDictionary(args); - if (criteria.Count == 0 && args.Length == 1) - { - criteria = args[0] as IDictionary ?? args[0].ObjectToDictionary(); - } - } - else - { - criteria = MethodNameParser.ParseFromBinder(binder, args); - } - - if (criteria.Count == 0) throw new InvalidOperationException("No criteria specified for Delete. To delete all data, use DeleteAll()."); - - return ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), criteria); - } - } -} +using System; +using System.Collections.Generic; +using System.Dynamic; + +namespace Simple.Data.Commands +{ + using Extensions; + + class DeleteByCommand : ICommand + { + public bool IsCommandFor(string method) + { + return method.Equals("delete", StringComparison.InvariantCultureIgnoreCase) || method.StartsWith("deleteby", StringComparison.InvariantCultureIgnoreCase); + } + + public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) + { + SimpleExpression criteriaExpression = GetCriteriaExpression(binder, args, table); + return dataStrategy.Run.Delete(table.GetQualifiedName(), criteriaExpression); + } + + private static SimpleExpression GetCriteriaExpression(InvokeMemberBinder binder, object[] args, DynamicTable table) + { + IReadOnlyDictionary criteria; + if (binder.Name.Equals("delete", StringComparison.InvariantCultureIgnoreCase)) + { + criteria = binder.NamedArgumentsToDictionary(args); + if (criteria.Count == 0 && args.Length == 1) + { + criteria = args[0] as IReadOnlyDictionary ?? args[0].ObjectToDictionary(); + } + } + else + { + criteria = MethodNameParser.ParseFromBinder(binder, args); + } + + if (criteria.Count == 0) throw new InvalidOperationException("No criteria specified for Delete. To delete all data, use DeleteAll()."); + + return ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), criteria); + } + } +} diff --git a/Simple.Data/Commands/ExecuteFunctionCommand.cs b/Simple.Data/Commands/ExecuteFunctionCommand.cs index dcb62e28..e089dea3 100644 --- a/Simple.Data/Commands/ExecuteFunctionCommand.cs +++ b/Simple.Data/Commands/ExecuteFunctionCommand.cs @@ -1,53 +1,53 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Text; -using Simple.Data.Extensions; - -namespace Simple.Data.Commands -{ - public class ExecuteFunctionCommand - { - private readonly DataStrategy _database; - private readonly IAdapterWithFunctions _adapter; - private readonly string _functionName; - private readonly IDictionary _arguments; - - public ExecuteFunctionCommand(DataStrategy database, IAdapterWithFunctions adapter, string functionName, IDictionary arguments) - { - _database = database; - _adapter = adapter; - _functionName = functionName; - _arguments = arguments; - } - - public bool Execute(out object result) - { - result = ToMultipleResultSets(_adapter.Execute(_functionName, _arguments)); - return true; - } - - private SimpleResultSet ToMultipleResultSets(object source) - { - if (source == null) return SimpleResultSet.Empty; - var resultSets = source as IEnumerable>>; - if (resultSets == null) throw new InvalidOperationException("Adapter returned incorrect Type."); - - return ToMultipleDynamicEnumerables(resultSets); - } - - private SimpleResultSet ToMultipleDynamicEnumerables(IEnumerable>> resultSets) - { - var result = new SimpleResultSet(resultSets.Select(resultSet => resultSet.Select(dict => new SimpleRecord(dict)))); - result.SetOutputValues(_arguments); - return result; - } - - public bool Execute(out object result, IAdapterTransaction adapterTransaction) - { - result = ToMultipleResultSets(_adapter.Execute(_functionName, _arguments, adapterTransaction)); - return true; - } - } -} +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using Simple.Data.Extensions; + +namespace Simple.Data.Commands +{ + public class ExecuteFunctionCommand + { + private readonly DataStrategy _database; + private readonly IAdapterWithFunctions _adapter; + private readonly string _functionName; + private readonly IReadOnlyDictionary _arguments; + + public ExecuteFunctionCommand(DataStrategy database, IAdapterWithFunctions adapter, string functionName, IReadOnlyDictionary arguments) + { + _database = database; + _adapter = adapter; + _functionName = functionName; + _arguments = arguments; + } + + public bool Execute(out object result) + { + result = ToMultipleResultSets(_adapter.Execute(_functionName, _arguments)); + return true; + } + + private SimpleResultSet ToMultipleResultSets(object source) + { + if (source == null) return SimpleResultSet.Empty; + var resultSets = source as IEnumerable>>; + if (resultSets == null) throw new InvalidOperationException("Adapter returned incorrect Type."); + + return ToMultipleDynamicEnumerables(resultSets); + } + + private SimpleResultSet ToMultipleDynamicEnumerables(IEnumerable>> resultSets) + { + var result = new SimpleResultSet(resultSets.Select(resultSet => resultSet.Select(dict => new SimpleRecord(dict)))); + result.SetOutputValues(_arguments); + return result; + } + + public bool Execute(out object result, IAdapterTransaction adapterTransaction) + { + result = ToMultipleResultSets(_adapter.Execute(_functionName, _arguments, adapterTransaction)); + return true; + } + } +} diff --git a/Simple.Data/Commands/FindByCommand.cs b/Simple.Data/Commands/FindByCommand.cs index 04bbdfd6..08d7ac45 100644 --- a/Simple.Data/Commands/FindByCommand.cs +++ b/Simple.Data/Commands/FindByCommand.cs @@ -1,92 +1,93 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Dynamic; -using System.Linq; - -namespace Simple.Data.Commands -{ - using System.Reflection; - using Extensions; - - class FindByCommand : ICommand, ICreateDelegate, IQueryCompatibleCommand - { - public bool IsCommandFor(string method) - { - return method.StartsWith("FindBy") || method.StartsWith("find_by_", StringComparison.InvariantCultureIgnoreCase); - } - - public Func CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) - { - if (dataStrategy is SimpleTransaction) return null; - - if (binder.Name.Equals("FindBy") || binder.Name.Equals("find_by")) - { - ArgumentHelper.CheckFindArgs(args, binder); - if (args.Length == 1 && args[0].IsAnonymous()) return null; - } - - var criteriaDictionary = ArgumentHelper.CreateCriteriaDictionary(binder, args, "FindBy", "find_by"); - if (criteriaDictionary == null) return null; - - var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), criteriaDictionary); - try - { - var adapter = dataStrategy.GetAdapter(); - var func = adapter.OptimizingDelegateFactory.CreateFindOneDelegate(adapter, table.GetQualifiedName(), criteriaExpression); - return a => - { - var data = func(a); - return (data != null && data.Count > 0) - ? new SimpleRecord(data, table.GetQualifiedName(), dataStrategy) - : null; - }; - } - catch (NotImplementedException) - { - return null; - } - } - - private static IEnumerable> CreateCriteriaDictionary(InvokeMemberBinder binder, IList args) - { - IDictionary criteriaDictionary = null; - if (binder.Name.Equals("FindBy") || binder.Name.Equals("find_by")) - { - if (args.Count == 0) throw new ArgumentException("FindBy requires arguments."); - if (binder.CallInfo.ArgumentNames != null && binder.CallInfo.ArgumentNames.Count > 0) - { - criteriaDictionary = binder.NamedArgumentsToDictionary(args); - } - else if (args.Count == 1) - { - if (ReferenceEquals(args[0], null)) throw new ArgumentException("FindBy does not accept unnamed null argument."); - criteriaDictionary = args[0].ObjectToDictionary(); - } - } - else - { - criteriaDictionary = MethodNameParser.ParseFromBinder(binder, args); - } - return criteriaDictionary; - } - - public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) - { - var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), - CreateCriteriaDictionary(binder, - args)); - var data = dataStrategy.Run.FindOne(table.GetQualifiedName(), criteriaExpression); - return data != null ? new SimpleRecord(data, table.GetQualifiedName(), dataStrategy) : null; - } - - public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args) - { - var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(query.TableName, - CreateCriteriaDictionary(binder, - args)); - query = query.Where(criteriaExpression).Take(1); - return query.FirstOrDefault(); - } - } -} +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using Simple.Data.Operations; + +namespace Simple.Data.Commands +{ + using System.Reflection; + using Extensions; + + class FindByCommand : ICommand, ICreateDelegate, IQueryCompatibleCommand + { + public bool IsCommandFor(string method) + { + return method.StartsWith("FindBy") || method.StartsWith("find_by_", StringComparison.InvariantCultureIgnoreCase); + } + + public Func CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) + { + if (dataStrategy is SimpleTransaction) return null; + + if (binder.Name.Equals("FindBy") || binder.Name.Equals("find_by")) + { + ArgumentHelper.CheckFindArgs(args, binder); + if (args.Length == 1 && args[0].IsAnonymous()) return null; + } + + var criteriaDictionary = ArgumentHelper.CreateCriteriaDictionary(binder, args, "FindBy", "find_by"); + if (criteriaDictionary == null) return null; + + var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), criteriaDictionary); + try + { + var adapter = dataStrategy.GetAdapter(); + var func = adapter.OptimizingDelegateFactory.CreateFindOneDelegate(adapter, table.GetQualifiedName(), criteriaExpression); + return a => + { + var data = func(a); + return (data != null && data.Count > 0) + ? new SimpleRecord(data, table.GetQualifiedName(), dataStrategy) + : null; + }; + } + catch (NotImplementedException) + { + return null; + } + } + + private static IEnumerable> CreateCriteriaDictionary(InvokeMemberBinder binder, IList args) + { + IReadOnlyDictionary criteriaDictionary = null; + if (binder.Name.Equals("FindBy") || binder.Name.Equals("find_by")) + { + if (args.Count == 0) throw new ArgumentException("FindBy requires arguments."); + if (binder.CallInfo.ArgumentNames != null && binder.CallInfo.ArgumentNames.Count > 0) + { + criteriaDictionary = binder.NamedArgumentsToDictionary(args); + } + else if (args.Count == 1) + { + if (ReferenceEquals(args[0], null)) throw new ArgumentException("FindBy does not accept unnamed null argument."); + criteriaDictionary = args[0].ObjectToDictionary(); + } + } + else + { + criteriaDictionary = MethodNameParser.ParseFromBinder(binder, args); + } + return criteriaDictionary; + } + + public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) + { + var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), + CreateCriteriaDictionary(binder, + args)); + var data = dataStrategy.Run.FindOne(new FindOperation(table.GetQualifiedName(), criteriaExpression)); + return data != null ? new SimpleRecord(data, table.GetQualifiedName(), dataStrategy) : null; + } + + public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args) + { + var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(query.TableName, + CreateCriteriaDictionary(binder, + args)); + query = query.Where(criteriaExpression).Take(1); + return query.FirstOrDefault(); + } + } +} diff --git a/Simple.Data/Commands/FindCommand.cs b/Simple.Data/Commands/FindCommand.cs index c5bf450e..74b690b9 100644 --- a/Simple.Data/Commands/FindCommand.cs +++ b/Simple.Data/Commands/FindCommand.cs @@ -1,47 +1,48 @@ -using System; -using System.Collections.Generic; -using System.Dynamic; -using System.Linq; -using System.Text; - -namespace Simple.Data.Commands -{ - class FindCommand : ICommand, IQueryCompatibleCommand - { - /// - /// Determines whether the instance is able to handle the specified method. - /// - /// The method name. - /// - /// true if the instance is able to handle the specified method; otherwise, false. - /// - public bool IsCommandFor(string method) - { - return method.Equals("find", StringComparison.InvariantCultureIgnoreCase); - } - - /// - /// Executes the command. - /// - /// The database (or transaction) - /// - /// The binder from the method invocation. - /// The arguments from the method invocation. - /// - public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) - { - if (args.Length == 1 && args[0] is SimpleExpression) - { - var data = dataStrategy.Run.FindOne(table.GetQualifiedName(), (SimpleExpression)args[0]); - return data != null ? new SimpleRecord(data, table.GetQualifiedName(), dataStrategy) : null; - } - - throw new BadExpressionException("Find only accepts a criteria expression."); - } - - public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args) - { - return query.Where((SimpleExpression) args[0]).Take(1).FirstOrDefault(); - } - } -} +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Text; +using Simple.Data.Operations; + +namespace Simple.Data.Commands +{ + class FindCommand : ICommand, IQueryCompatibleCommand + { + /// + /// Determines whether the instance is able to handle the specified method. + /// + /// The method name. + /// + /// true if the instance is able to handle the specified method; otherwise, false. + /// + public bool IsCommandFor(string method) + { + return method.Equals("find", StringComparison.InvariantCultureIgnoreCase); + } + + /// + /// Executes the command. + /// + /// The database (or transaction) + /// + /// The binder from the method invocation. + /// The arguments from the method invocation. + /// + public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) + { + if (args.Length == 1 && args[0] is SimpleExpression) + { + var data = dataStrategy.Run.FindOne(new FindOperation(table.GetQualifiedName(), (SimpleExpression)args[0])); + return data != null ? new SimpleRecord(data, table.GetQualifiedName(), dataStrategy) : null; + } + + throw new BadExpressionException("Find only accepts a criteria expression."); + } + + public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args) + { + return query.Where((SimpleExpression) args[0]).Take(1).FirstOrDefault(); + } + } +} diff --git a/Simple.Data/Commands/GetCommand.cs b/Simple.Data/Commands/GetCommand.cs index e30547e7..492db51b 100644 --- a/Simple.Data/Commands/GetCommand.cs +++ b/Simple.Data/Commands/GetCommand.cs @@ -1,52 +1,53 @@ -using System; -using System.Collections.Generic; -using System.Dynamic; -using System.Linq; -using System.Text; - -namespace Simple.Data.Commands -{ - using Extensions; - - public class GetCommand : ICommand, ICreateDelegate, IQueryCompatibleCommand - { - public bool IsCommandFor(string method) - { - return method.Equals("get", StringComparison.OrdinalIgnoreCase) || method.Equals("getscalar", StringComparison.OrdinalIgnoreCase); - } - - public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) - { - var result = dataStrategy.Run.Get(table.GetName(), args); - if (result == null || result.Count == 0) return null; - return binder.Name.Equals("get", StringComparison.OrdinalIgnoreCase) - ? new SimpleRecord(result, table.GetQualifiedName(), dataStrategy) - : result.First().Value; - } - - public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args) - { - var keyNames = dataStrategy.GetAdapter().GetKeyNames(query.TableName); - var dict = keyNames.Select((k, i) => new KeyValuePair(k, args[i])); - query = query.Where(ExpressionHelper.CriteriaDictionaryToExpression(query.TableName, dict)).Take(1); - var result = query.FirstOrDefault(); - if (result == null) return null; - return binder.Name.Equals("get", StringComparison.OrdinalIgnoreCase) ? result : ((IDictionary) result).First().Value; - } - - public Func CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) - { - if (dataStrategy is SimpleTransaction) return null; - - var func = dataStrategy.GetAdapter().OptimizingDelegateFactory.CreateGetDelegate(dataStrategy.GetAdapter(), - table.GetQualifiedName(), args); - return a => - { - var data = func(a); - return (data != null && data.Count > 0) - ? new SimpleRecord(data, table.GetQualifiedName(), dataStrategy) - : null; - }; - } - } -} +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Text; +using Simple.Data.Operations; + +namespace Simple.Data.Commands +{ + using Extensions; + + public class GetCommand : ICommand, ICreateDelegate, IQueryCompatibleCommand + { + public bool IsCommandFor(string method) + { + return method.Equals("get", StringComparison.OrdinalIgnoreCase) || method.Equals("getscalar", StringComparison.OrdinalIgnoreCase); + } + + public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) + { + var result = dataStrategy.Run.Get(new GetOperation(table.GetName(), args)); + if (result == null || result.Count == 0) return null; + return binder.Name.Equals("get", StringComparison.OrdinalIgnoreCase) + ? new SimpleRecord(result, table.GetQualifiedName(), dataStrategy) + : result.First().Value; + } + + public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args) + { + var keyNames = dataStrategy.GetAdapter().GetKeyNames(query.TableName); + var dict = keyNames.Select((k, i) => new KeyValuePair(k, args[i])); + query = query.Where(ExpressionHelper.CriteriaDictionaryToExpression(query.TableName, dict)).Take(1); + var result = query.FirstOrDefault(); + if (result == null) return null; + return binder.Name.Equals("get", StringComparison.OrdinalIgnoreCase) ? result : ((IDictionary) result).First().Value; + } + + public Func CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) + { + if (dataStrategy is SimpleTransaction) return null; + + var func = dataStrategy.GetAdapter().OptimizingDelegateFactory.CreateGetDelegate(dataStrategy.GetAdapter(), + new GetOperation(table.GetQualifiedName(), args)); + return a => + { + var data = func(a); + return (data != null && data.Count > 0) + ? new SimpleRecord(data, table.GetQualifiedName(), dataStrategy) + : null; + }; + } + } +} diff --git a/Simple.Data/Commands/InsertCommand.cs b/Simple.Data/Commands/InsertCommand.cs index c4fbf673..4cbd873b 100644 --- a/Simple.Data/Commands/InsertCommand.cs +++ b/Simple.Data/Commands/InsertCommand.cs @@ -1,83 +1,92 @@ -using System; -using System.Collections.Generic; -using System.Dynamic; -using System.Linq; -using System.Linq.Expressions; -using Simple.Data.Extensions; - -namespace Simple.Data.Commands -{ - using System.Collections; - - class InsertCommand : ICommand - { - public bool IsCommandFor(string method) - { - return method.Equals("insert", StringComparison.InvariantCultureIgnoreCase); - } - - public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) - { - var result = DoInsert(binder, args, dataStrategy, table.GetQualifiedName()); - - return ResultHelper.TypeResult(result, table, dataStrategy); - } - - private static object DoInsert(InvokeMemberBinder binder, object[] args, DataStrategy dataStrategy, string tableName) - { - if (binder.HasSingleUnnamedArgument()) - { - return InsertEntity(args[0], dataStrategy, tableName, (r,e) => false, !binder.IsResultDiscarded()); - } - - if (args.Length == 2) - { - var onError = args[1] as ErrorCallback; - if (onError != null) - { - return InsertEntity(args[0], dataStrategy, tableName, onError, !binder.IsResultDiscarded()); - } - } - return InsertDictionary(binder, args, dataStrategy, tableName); - } - - private static object InsertDictionary(InvokeMemberBinder binder, IEnumerable args, DataStrategy dataStrategy, string tableName) - { - return dataStrategy.Run.Insert(tableName, binder.NamedArgumentsToDictionary(args), !binder.IsResultDiscarded()); - } - - private static object InsertEntity(object entity, DataStrategy dataStrategy, string tableName, ErrorCallback onError, bool resultRequired) - { - var dictionary = entity as IDictionary; - if (dictionary != null) - return dataStrategy.Run.Insert(tableName, dictionary, resultRequired); - - var list = entity as IEnumerable>; - if (list != null) - return dataStrategy.Run.InsertMany(tableName, list, onError, resultRequired); - - var entityList = entity as IEnumerable; - if (entityList != null) - { - var array = entityList.Cast().ToArray(); - var rows = new List>(); - foreach (var o in array) - { - dictionary = (o as IDictionary) ?? o.ObjectToDictionary(); - if (dictionary.Count == 0) - { - throw new SimpleDataException("Could not discover data in object."); - } - rows.Add(dictionary); - } - - return dataStrategy.Run.InsertMany(tableName, rows, onError, resultRequired); - } - - dictionary = entity.ObjectToDictionary(); - if (dictionary.Count == 0) - throw new SimpleDataException("Could not discover data in object."); - return dataStrategy.Run.Insert(tableName, dictionary, resultRequired); - } - } -} +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Linq.Expressions; +using Simple.Data.Extensions; + +namespace Simple.Data.Commands +{ + using System.Collections; + using System.Collections.ObjectModel; + using Operations; + + class InsertCommand : ICommand + { + public bool IsCommandFor(string method) + { + return method.Equals("insert", StringComparison.InvariantCultureIgnoreCase); + } + + public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) + { + var result = DoInsert(binder, args, dataStrategy, table.GetQualifiedName()); + + return ResultHelper.TypeResult(result, table, dataStrategy); + } + + private static object DoInsert(InvokeMemberBinder binder, object[] args, DataStrategy dataStrategy, string tableName) + { + if (binder.HasSingleUnnamedArgument()) + { + return InsertEntity(args[0], dataStrategy, tableName, (r,e) => false, !binder.IsResultDiscarded()); + } + + if (args.Length == 2) + { + var onError = args[1] as ErrorCallback; + if (onError != null) + { + return InsertEntity(args[0], dataStrategy, tableName, onError, !binder.IsResultDiscarded()); + } + } + return InsertDictionary(binder, args, dataStrategy, tableName); + } + + private static object InsertDictionary(InvokeMemberBinder binder, IEnumerable args, DataStrategy dataStrategy, string tableName) + { + var operation = new InsertOperation(tableName, Enumerable.Repeat(binder.NamedArgumentsToDictionary(args), 1), + !binder.IsResultDiscarded()); + return dataStrategy.Run.Insert(operation); + } + + private static IEnumerable> InsertEntity(object entity, DataStrategy dataStrategy, string tableName, ErrorCallback onError, bool resultRequired) + { + var readOnlyDictionary = entity as IReadOnlyDictionary; + if (readOnlyDictionary != null) + { + var operation = new InsertOperation(tableName, readOnlyDictionary, resultRequired); + return dataStrategy.Run.Insert(operation); + } + + var list = entity as IEnumerable>; + if (list != null) + { + return dataStrategy.Run.Insert(new InsertOperation(tableName, list, resultRequired, onError)); + } + + var entityList = entity as IEnumerable; + if (entityList != null) + { + var array = entityList.Cast().ToArray(); + var rows = new List>(); + foreach (var o in array) + { + readOnlyDictionary = (o as IReadOnlyDictionary) ?? o.ObjectToDictionary(); + if (readOnlyDictionary.Count == 0) + { + throw new SimpleDataException("Could not discover data in object."); + } + rows.Add(readOnlyDictionary); + } + + return dataStrategy.Run.Insert(new InsertOperation(tableName, rows, resultRequired, onError)); + } + + readOnlyDictionary = entity.ObjectToDictionary(); + if (readOnlyDictionary.Count == 0) + throw new SimpleDataException("Could not discover data in object."); + return dataStrategy.Run.Insert(new InsertOperation(tableName, readOnlyDictionary, resultRequired)); + } + } +} diff --git a/Simple.Data/Commands/UpsertByCommand.cs b/Simple.Data/Commands/UpsertByCommand.cs index 428f5cc2..68fdbe6b 100644 --- a/Simple.Data/Commands/UpsertByCommand.cs +++ b/Simple.Data/Commands/UpsertByCommand.cs @@ -1,69 +1,72 @@ -namespace Simple.Data.Commands -{ - using System; - using System.Collections.Generic; - using System.Dynamic; - using System.Linq; - using Extensions; - - class UpsertByCommand : ICommand - { - public bool IsCommandFor(string method) - { - return method.Homogenize().StartsWith("upsertby", StringComparison.InvariantCultureIgnoreCase); - } - - public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) - { - object result; - - if (binder.HasSingleUnnamedArgument() || args.Length == 2 && args[1] is ErrorCallback) - { - result = UpsertByKeyFields(table.GetQualifiedName(), dataStrategy, args[0], - MethodNameParser.ParseCriteriaNamesFromMethodName(binder.Name), - !binder.IsResultDiscarded(), - args.Length == 2 ? (ErrorCallback)args[1] : ((item, exception) => false)); - } - else - { - var criteria = MethodNameParser.ParseFromBinder(binder, args); - var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), - criteria); - var data = binder.NamedArgumentsToDictionary(args); - result = dataStrategy.Run.Upsert(table.GetQualifiedName(), data, criteriaExpression, !binder.IsResultDiscarded()); - } - - return ResultHelper.TypeResult(result, table, dataStrategy); - } - - internal static object UpsertByKeyFields(string tableName, DataStrategy dataStrategy, object entity, IEnumerable keyFieldNames, bool isResultRequired, ErrorCallback errorCallback) - { - var record = UpdateCommand.ObjectToDictionary(entity); - var list = record as IList>; - if (list != null) return dataStrategy.Run.UpsertMany(tableName, list, keyFieldNames, isResultRequired, errorCallback); - - var dict = record as IDictionary; - var criteria = GetCriteria(keyFieldNames, dict); - var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(tableName, criteria); - return dataStrategy.Run.Upsert(tableName, dict, criteriaExpression, isResultRequired); - } - - private static IEnumerable> GetCriteria(IEnumerable keyFieldNames, IDictionary record) - { - var criteria = new Dictionary(); - - foreach (var keyFieldName in keyFieldNames) - { - var name = keyFieldName; - var keyValuePair = record.SingleOrDefault(kvp => kvp.Key.Homogenize().Equals(name.Homogenize())); - if (string.IsNullOrWhiteSpace(keyValuePair.Key)) - { - throw new InvalidOperationException("Key field value not set."); - } - - criteria.Add(keyFieldName, keyValuePair.Value); - } - return criteria; - } - } +namespace Simple.Data.Commands +{ + using System; + using System.Collections.Generic; + using System.Dynamic; + using System.Linq; + using Extensions; + using Operations; + + class UpsertByCommand : ICommand + { + public bool IsCommandFor(string method) + { + return method.Homogenize().StartsWith("upsertby", StringComparison.InvariantCultureIgnoreCase); + } + + public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) + { + object result; + + if (binder.HasSingleUnnamedArgument() || args.Length == 2 && args[1] is ErrorCallback) + { + result = UpsertByKeyFields(table.GetQualifiedName(), dataStrategy, args[0], + MethodNameParser.ParseCriteriaNamesFromMethodName(binder.Name), + !binder.IsResultDiscarded(), + args.Length == 2 ? (ErrorCallback)args[1] : ((item, exception) => false)); + } + else + { + var criteria = MethodNameParser.ParseFromBinder(binder, args); + var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), + criteria); + var data = binder.NamedArgumentsToDictionary(args); + result = dataStrategy.Run.Upsert(table.GetQualifiedName(), data, criteriaExpression, !binder.IsResultDiscarded()); + } + + return ResultHelper.TypeResult(result, table, dataStrategy); + } + + internal static object UpsertByKeyFields(string tableName, DataStrategy dataStrategy, object entity, IEnumerable keyFieldNames, bool isResultRequired, ErrorCallback errorCallback) + { + var record = UpdateCommand.ObjectToDictionary(entity); + var list = record as IList>; + var operation = new UpsertOperation(tableName, list, isResultRequired, keyFieldNames.ToArray(), + errorCallback); + if (list != null) return dataStrategy.Run.Upsert(operation); + + var dict = record as IDictionary; + var criteria = GetCriteria(keyFieldNames, dict); + var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(tableName, criteria); + return dataStrategy.Run.Upsert(tableName, dict, criteriaExpression, isResultRequired); + } + + private static IEnumerable> GetCriteria(IEnumerable keyFieldNames, IDictionary record) + { + var criteria = new Dictionary(); + + foreach (var keyFieldName in keyFieldNames) + { + var name = keyFieldName; + var keyValuePair = record.SingleOrDefault(kvp => kvp.Key.Homogenize().Equals(name.Homogenize())); + if (string.IsNullOrWhiteSpace(keyValuePair.Key)) + { + throw new InvalidOperationException("Key field value not set."); + } + + criteria.Add(keyFieldName, keyValuePair.Value); + } + return criteria; + } + } } \ No newline at end of file diff --git a/Simple.Data/Commands/UpsertCommand.cs b/Simple.Data/Commands/UpsertCommand.cs index b6555d47..9a0be4ac 100644 --- a/Simple.Data/Commands/UpsertCommand.cs +++ b/Simple.Data/Commands/UpsertCommand.cs @@ -1,84 +1,85 @@ -namespace Simple.Data.Commands -{ - using System; - using System.Collections; - using System.Collections.Generic; - using System.Dynamic; - using System.Linq; - using Extensions; - - internal class UpsertCommand : ICommand - { - public bool IsCommandFor(string method) - { - return method.Equals("upsert", StringComparison.InvariantCultureIgnoreCase); - } - - public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) - { - object[] objects; - if (binder.CallInfo.ArgumentNames.Count > 0 && binder.CallInfo.ArgumentNames.All(s => !string.IsNullOrWhiteSpace(s))) - { - objects = new object[] {binder.NamedArgumentsToDictionary(args)}; - } - else if (args.Length == 0 || args.Length > 2) - { - throw new ArgumentException("Incorrect number of arguments to Upsert method."); - } - else - { - objects = args; - } - - var result = UpsertUsingKeys(dataStrategy, table, objects, !binder.IsResultDiscarded()); - - return ResultHelper.TypeResult(result, table, dataStrategy); - } - - private static object UpsertUsingKeys(DataStrategy dataStrategy, DynamicTable table, object[] args, bool isResultRequired) - { - var record = ObjectToDictionary(args[0]); - var list = record as IList>; - if (list != null) - { - ErrorCallback errorCallback = (args.Length == 2 ? args[1] as ErrorCallback : null) ?? - ((item, exception) => false); - return dataStrategy.Run.UpsertMany(table.GetQualifiedName(), list, isResultRequired, errorCallback); - } - - var dict = record as IDictionary; - if (dict == null) throw new InvalidOperationException("Could not resolve data from passed object."); - var key = dataStrategy.GetAdapter().GetKey(table.GetQualifiedName(), dict); - if (key == null) throw new InvalidOperationException(string.Format("No key columns defined for table \"{0}\"",table.GetQualifiedName())); - if (key.Count == 0) return dataStrategy.Run.Insert(table.GetQualifiedName(), dict, isResultRequired); - var criteria = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), key); - return dataStrategy.Run.Upsert(table.GetQualifiedName(), dict, criteria, isResultRequired); - } - - internal static object ObjectToDictionary(object obj) - { - var dynamicRecord = obj as SimpleRecord; - if (dynamicRecord != null) - { - return new Dictionary(dynamicRecord, HomogenizedEqualityComparer.DefaultInstance); - } - - var dictionary = obj as IDictionary; - if (dictionary != null) - { - return dictionary; - } - - var list = obj as IEnumerable; - if (list != null) - { - var originals = list.Cast().ToList(); - var dictionaries = originals.Select(o => ObjectToDictionary(o) as IDictionary).Where(o => o != null && o.Count > 0).ToList(); - if (originals.Count == dictionaries.Count) - return dictionaries; - } - - return obj.ObjectToDictionary(); - } - } +namespace Simple.Data.Commands +{ + using System; + using System.Collections; + using System.Collections.Generic; + using System.Dynamic; + using System.Linq; + using Extensions; + using Operations; + + internal class UpsertCommand : ICommand + { + public bool IsCommandFor(string method) + { + return method.Equals("upsert", StringComparison.InvariantCultureIgnoreCase); + } + + public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) + { + object[] objects; + if (binder.CallInfo.ArgumentNames.Count > 0 && binder.CallInfo.ArgumentNames.All(s => !string.IsNullOrWhiteSpace(s))) + { + objects = new object[] {binder.NamedArgumentsToDictionary(args)}; + } + else if (args.Length == 0 || args.Length > 2) + { + throw new ArgumentException("Incorrect number of arguments to Upsert method."); + } + else + { + objects = args; + } + + var result = UpsertUsingKeys(dataStrategy, table, objects, !binder.IsResultDiscarded()); + + return ResultHelper.TypeResult(result, table, dataStrategy); + } + + private static object UpsertUsingKeys(DataStrategy dataStrategy, DynamicTable table, object[] args, bool isResultRequired) + { + var record = ObjectToDictionary(args[0]); + var list = record as IList>; + if (list != null) + { + ErrorCallback errorCallback = (args.Length == 2 ? args[1] as ErrorCallback : null) ?? + ((item, exception) => false); + return dataStrategy.Run.Upsert(new UpsertOperation(table.GetQualifiedName(), list, isResultRequired, null, errorCallback)); + } + + var dict = record as IReadOnlyDictionary; + if (dict == null) throw new InvalidOperationException("Could not resolve data from passed object."); + var key = dataStrategy.GetAdapter().GetKey(table.GetQualifiedName(), dict); + if (key == null) throw new InvalidOperationException(string.Format("No key columns defined for table \"{0}\"",table.GetQualifiedName())); + if (key.Count == 0) return dataStrategy.Run.Insert(new InsertOperation(table.GetQualifiedName(), dict, isResultRequired)); + var criteria = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), key); + return dataStrategy.Run.Upsert(new UpsertOperation(table.GetQualifiedName(), dict, isResultRequired)); + } + + internal static object ObjectToDictionary(object obj) + { + var dynamicRecord = obj as SimpleRecord; + if (dynamicRecord != null) + { + return new Dictionary(dynamicRecord, HomogenizedEqualityComparer.DefaultInstance); + } + + var dictionary = obj as IDictionary; + if (dictionary != null) + { + return dictionary; + } + + var list = obj as IEnumerable; + if (list != null) + { + var originals = list.Cast().ToList(); + var dictionaries = originals.Select(o => ObjectToDictionary(o) as IDictionary).Where(o => o != null && o.Count > 0).ToList(); + if (originals.Count == dictionaries.Count) + return dictionaries; + } + + return obj.ObjectToDictionary(); + } + } } \ No newline at end of file diff --git a/Simple.Data/DataStrategy.cs b/Simple.Data/DataStrategy.cs index e1f2990b..33c8f165 100644 --- a/Simple.Data/DataStrategy.cs +++ b/Simple.Data/DataStrategy.cs @@ -1,142 +1,142 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Dynamic; -using System.Linq; -using System.Text; -using Simple.Data.Commands; - -namespace Simple.Data -{ - using System.Reflection; - - /// - /// This class supports the Simple.Data framework internally and should not be used in your code. - /// - public abstract class DataStrategy : DynamicObject, ICloneable - { - private readonly ConcurrentDictionary _members = new ConcurrentDictionary(); - - protected DataStrategy() {} - - protected DataStrategy(DataStrategy copy) - { - _members = copy._members; - } - - public abstract Adapter GetAdapter(); - - /// - /// Provides the implementation for operations that get member values. Classes derived from the class can override this method to specify dynamic behavior for operations such as getting a value for a property. - /// - /// Provides information about the object that called the dynamic operation. The binder.Name property provides the name of the member on which the dynamic operation is performed. For example, for the Console.WriteLine(sampleObject.SampleProperty) statement, where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleProperty". The binder.IgnoreCase property specifies whether the member name is case-sensitive. - /// The result of the get operation. For example, if the method is called for a property, you can assign the property value to . - /// - /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a run-time exception is thrown.) - /// - public override bool TryGetMember(GetMemberBinder binder, out object result) - { - return GetDynamicMember(binder, out result); - } - - protected virtual bool GetDynamicMember(GetMemberBinder binder, out object result) - { - result = GetOrAddDynamicReference(binder.Name); - return true; - } - - private dynamic GetOrAddDynamicReference(string name) - { - return _members.GetOrAdd(name, CreateDynamicReference); - } - - internal bool TryInvokeFunction(String functionName, Func> getFunctionArguments, - out object result) - { - var adapterWithFunctions = GetAdapter() as IAdapterWithFunctions; - if (adapterWithFunctions != null && adapterWithFunctions.IsValidFunction(functionName)) - { - var command = new ExecuteFunctionCommand(GetDatabase(), adapterWithFunctions, functionName, - getFunctionArguments()); - return ExecuteFunction(out result, command); - } - result = null; - return false; - } - - protected internal abstract bool ExecuteFunction(out object result, ExecuteFunctionCommand command); - - public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) - { - if (TryInvokeFunction(binder.Name, () => binder.ArgumentsToDictionary(args), out result)) return true; - - if (new AdapterMethodDynamicInvoker(GetAdapter()).TryInvokeMember(binder, args, out result)) return true; - - return base.TryInvokeMember(binder, args, out result); - } - - public dynamic this[string name] - { - get { return GetOrAddDynamicReference(name); } - } - - private ObjectReference CreateDynamicReference(string name) - { - return new ObjectReference(name, this); - } - - internal DynamicTable SetMemberAsTable(ObjectReference reference) - { - if (reference == null) throw new ArgumentNullException("reference"); - _members.TryUpdate(reference.GetName(), new DynamicTable(reference.GetName(), this), reference); - return (DynamicTable) _members[reference.GetName()]; - } - - internal DynamicTable SetMemberAsTable(ObjectReference reference, DynamicTable table) - { - if (reference == null) throw new ArgumentNullException("reference"); - _members.TryUpdate(reference.GetName(), table, reference); - return (DynamicTable) _members[reference.GetName()]; - } - - internal DynamicSchema SetMemberAsSchema(ObjectReference reference) - { - if (ReferenceEquals(reference, null)) throw new ArgumentNullException("reference"); - _members.TryUpdate(reference.GetName(), new DynamicSchema(reference.GetName(), this), reference); - return (DynamicSchema) _members[reference.GetName()]; - } - - internal DynamicSchema SetMemberAsSchema(ObjectReference reference, DynamicSchema schema) - { - if (reference == null) throw new ArgumentNullException("reference"); - _members.TryUpdate(reference.GetName(), schema, reference); - return (DynamicSchema) _members[reference.GetName()]; - } - - protected internal abstract DataStrategy GetDatabase(); - - internal bool IsExpressionFunction(string name, object[] args) - { - return GetAdapter().IsExpressionFunction(name, args); - } - - internal abstract RunStrategy Run { get; } - - object ICloneable.Clone() - { - return Clone(); - } - - protected internal abstract DataStrategy Clone(); - - public dynamic WithOptions(OptionsBase options) - { - return new DataStrategyWithOptions(this, options); - } - - public virtual dynamic ClearOptions() - { - return this; - } - } -} +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Text; +using Simple.Data.Commands; + +namespace Simple.Data +{ + using System.Reflection; + + /// + /// This class supports the Simple.Data framework internally and should not be used in your code. + /// + public abstract class DataStrategy : DynamicObject, ICloneable + { + private readonly ConcurrentDictionary _members = new ConcurrentDictionary(); + + protected DataStrategy() {} + + protected DataStrategy(DataStrategy copy) + { + _members = copy._members; + } + + public abstract Adapter GetAdapter(); + + /// + /// Provides the implementation for operations that get member values. Classes derived from the class can override this method to specify dynamic behavior for operations such as getting a value for a property. + /// + /// Provides information about the object that called the dynamic operation. The binder.Name property provides the name of the member on which the dynamic operation is performed. For example, for the Console.WriteLine(sampleObject.SampleProperty) statement, where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleProperty". The binder.IgnoreCase property specifies whether the member name is case-sensitive. + /// The result of the get operation. For example, if the method is called for a property, you can assign the property value to . + /// + /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a run-time exception is thrown.) + /// + public override bool TryGetMember(GetMemberBinder binder, out object result) + { + return GetDynamicMember(binder, out result); + } + + protected virtual bool GetDynamicMember(GetMemberBinder binder, out object result) + { + result = GetOrAddDynamicReference(binder.Name); + return true; + } + + private dynamic GetOrAddDynamicReference(string name) + { + return _members.GetOrAdd(name, CreateDynamicReference); + } + + internal bool TryInvokeFunction(String functionName, Func> getFunctionArguments, + out object result) + { + var adapterWithFunctions = GetAdapter() as IAdapterWithFunctions; + if (adapterWithFunctions != null && adapterWithFunctions.IsValidFunction(functionName)) + { + var command = new ExecuteFunctionCommand(GetDatabase(), adapterWithFunctions, functionName, + getFunctionArguments()); + return ExecuteFunction(out result, command); + } + result = null; + return false; + } + + protected internal abstract bool ExecuteFunction(out object result, ExecuteFunctionCommand command); + + public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) + { + if (TryInvokeFunction(binder.Name, () => binder.ArgumentsToDictionary(args), out result)) return true; + + if (new AdapterMethodDynamicInvoker(GetAdapter()).TryInvokeMember(binder, args, out result)) return true; + + return base.TryInvokeMember(binder, args, out result); + } + + public dynamic this[string name] + { + get { return GetOrAddDynamicReference(name); } + } + + private ObjectReference CreateDynamicReference(string name) + { + return new ObjectReference(name, this); + } + + internal DynamicTable SetMemberAsTable(ObjectReference reference) + { + if (reference == null) throw new ArgumentNullException("reference"); + _members.TryUpdate(reference.GetName(), new DynamicTable(reference.GetName(), this), reference); + return (DynamicTable) _members[reference.GetName()]; + } + + internal DynamicTable SetMemberAsTable(ObjectReference reference, DynamicTable table) + { + if (reference == null) throw new ArgumentNullException("reference"); + _members.TryUpdate(reference.GetName(), table, reference); + return (DynamicTable) _members[reference.GetName()]; + } + + internal DynamicSchema SetMemberAsSchema(ObjectReference reference) + { + if (ReferenceEquals(reference, null)) throw new ArgumentNullException("reference"); + _members.TryUpdate(reference.GetName(), new DynamicSchema(reference.GetName(), this), reference); + return (DynamicSchema) _members[reference.GetName()]; + } + + internal DynamicSchema SetMemberAsSchema(ObjectReference reference, DynamicSchema schema) + { + if (reference == null) throw new ArgumentNullException("reference"); + _members.TryUpdate(reference.GetName(), schema, reference); + return (DynamicSchema) _members[reference.GetName()]; + } + + protected internal abstract DataStrategy GetDatabase(); + + internal bool IsExpressionFunction(string name, object[] args) + { + return GetAdapter().IsExpressionFunction(name, args); + } + + internal abstract RunStrategy Run { get; } + + object ICloneable.Clone() + { + return Clone(); + } + + protected internal abstract DataStrategy Clone(); + + public dynamic WithOptions(OptionsBase options) + { + return new DataStrategyWithOptions(this, options); + } + + public virtual dynamic ClearOptions() + { + return this; + } + } +} diff --git a/Simple.Data/DatabaseRunner.cs b/Simple.Data/DatabaseRunner.cs index 9e9b0ba3..4966774f 100644 --- a/Simple.Data/DatabaseRunner.cs +++ b/Simple.Data/DatabaseRunner.cs @@ -1,118 +1,102 @@ -namespace Simple.Data -{ - using System.Collections.Generic; - - internal class DatabaseRunner : RunStrategy - { - private readonly Adapter _adapter; - public DatabaseRunner(Adapter adapter) - { - _adapter = adapter; - } - - protected override Adapter Adapter - { - get { return _adapter; } - } - - internal override IDictionary FindOne(string tableName, SimpleExpression criteria) - { - return _adapter.FindOne(tableName, criteria); - } - - internal override int UpdateMany(string tableName, IList> dataList) - { - return _adapter.UpdateMany(tableName, dataList); - } - - internal override int UpdateMany(string tableName, IList> dataList, IEnumerable criteriaFieldNames) - { - return _adapter.UpdateMany(tableName, dataList, criteriaFieldNames); - } - - internal override int UpdateMany(string tableName, IList> newValuesList, IList> originalValuesList) - { - int count = 0; - for (int i = 0; i < newValuesList.Count; i++) - { - count += Update(tableName, newValuesList[i], originalValuesList[i]); - } - return count; - } - - internal override int Update(string tableName, IDictionary newValuesDict, IDictionary originalValuesDict) - { - SimpleExpression criteria = CreateCriteriaFromOriginalValues(tableName, newValuesDict, originalValuesDict); - var changedValuesDict = CreateChangedValuesDict(newValuesDict, originalValuesDict); - return _adapter.Update(tableName, changedValuesDict, criteria); - } - - /// - /// Finds data from the specified "table". - /// - /// Name of the table. - /// The criteria. This may be null, in which case all records should be returned. - /// The list of records matching the criteria. If no records are found, return an empty list. - internal override IEnumerable> Find(string tableName, SimpleExpression criteria) - { - return _adapter.Find(tableName, criteria); - } - - /// - /// Inserts a record into the specified "table". - /// Name of the table.The values to insert.If possible, return the newly inserted row, including any automatically-set values such as primary keys or timestamps. - internal override IDictionary Insert(string tableName, IDictionary data, bool resultRequired) - { - return _adapter.Insert(tableName, data, resultRequired); - } - - /// - /// Inserts a record into the specified "table". - /// Name of the table.The values to insert.If possible, return the newly inserted row, including any automatically-set values such as primary keys or timestamps. - internal override IEnumerable> InsertMany(string tableName, IEnumerable> data, ErrorCallback onError, bool resultRequired) - { - return _adapter.InsertMany(tableName, data, (dict, exception) => onError(new SimpleRecord(dict), exception), resultRequired); - } - - /// - /// Updates the specified "table" according to specified criteria. - /// Name of the table.The new values.The expression to use as criteria for the update operation.The number of records affected by the update operation. - internal override int Update(string tableName, IDictionary data, SimpleExpression criteria) - { - return _adapter.Update(tableName, data, criteria); - } - - public override IDictionary Upsert(string tableName, IDictionary dict, SimpleExpression criteriaExpression, bool isResultRequired) - { - return _adapter.Upsert(tableName, dict, criteriaExpression, isResultRequired); - } - - public override IEnumerable> UpsertMany(string tableName, IList> list, bool isResultRequired, ErrorCallback errorCallback) - { - return _adapter.UpsertMany(tableName, list, isResultRequired, (dict, exception) => errorCallback(new SimpleRecord(dict), exception)); - } - - public override IDictionary Get(string tableName, object[] args) - { - return _adapter.Get(tableName, args); - } - - public override IEnumerable> RunQuery(SimpleQuery query, out IEnumerable unhandledClauses) - { - return _adapter.RunQuery(query, out unhandledClauses); - } - - public override IEnumerable> UpsertMany(string tableName, IList> list, IEnumerable keyFieldNames, bool isResultRequired, ErrorCallback errorCallback) - { - return _adapter.UpsertMany(tableName, list, keyFieldNames, isResultRequired, (dict, exception) => errorCallback(new SimpleRecord(dict), exception)); - } - - /// - /// Deletes from the specified table. - /// Name of the table.The expression to use as criteria for the delete operation.The number of records which were deleted. - internal override int Delete(string tableName, SimpleExpression criteria) - { - return _adapter.Delete(tableName, criteria); - } - } +using Simple.Data.Operations; + +namespace Simple.Data +{ + using System.Collections.Generic; + using System.Linq; + + internal class DatabaseRunner : RunStrategy + { + private readonly Adapter _adapter; + public DatabaseRunner(Adapter adapter) + { + _adapter = adapter; + } + + protected override Adapter Adapter + { + get { return _adapter; } + } + + internal override IReadOnlyDictionary FindOne(FindOperation operation) + { + return _adapter.FindOne(operation); + } + + internal override int UpdateMany(string tableName, IList> dataList) + { + return _adapter.UpdateMany(tableName, dataList); + } + + internal override int UpdateMany(string tableName, IList> dataList, IEnumerable criteriaFieldNames) + { + return _adapter.UpdateMany(tableName, dataList, criteriaFieldNames); + } + + internal override int UpdateMany(string tableName, IList> newValuesList, IList> originalValuesList) + { + int count = 0; + for (int i = 0; i < newValuesList.Count; i++) + { + count += Update(tableName, newValuesList[i], originalValuesList[i]); + } + return count; + } + + internal override int Update(string tableName, IReadOnlyDictionary newValuesDict, IReadOnlyDictionary originalValuesDict) + { + SimpleExpression criteria = CreateCriteriaFromOriginalValues(tableName, newValuesDict, originalValuesDict); + var changedValuesDict = CreateChangedValuesDict(newValuesDict, originalValuesDict); + return _adapter.Update(tableName, changedValuesDict, criteria); + } + + /// + /// Finds data from the specified "table". + /// + /// Operation details. + /// The list of records matching the criteria. If no records are found, return an empty list. + internal override IEnumerable> Find(FindOperation operation) + { + return _adapter.Find(operation); + } + + /// + /// Inserts a record into the specified "table". + /// Name of the table.The values to insert.If possible, return the newly inserted row, including any automatically-set values such as primary keys or timestamps. + internal override IEnumerable> Insert(InsertOperation operation) + { + return _adapter.Insert(operation); + } + + /// + /// Updates the specified "table" according to specified criteria. + /// Name of the table.The new values.The expression to use as criteria for the update operation.The number of records affected by the update operation. + internal override int Update(string tableName, IReadOnlyDictionary data, SimpleExpression criteria) + { + return _adapter.Update(tableName, data, criteria); + } + + public override IEnumerable> Upsert(UpsertOperation operation) + { + return _adapter.Upsert(operation); + } + + public override IReadOnlyDictionary Get(GetOperation operation) + { + return _adapter.Get(operation); + } + + public override IEnumerable> RunQuery(SimpleQuery query, out IEnumerable unhandledClauses) + { + return _adapter.RunQuery(query, out unhandledClauses); + } + + /// + /// Deletes from the specified table. + /// Name of the table.The expression to use as criteria for the delete operation.The number of records which were deleted. + internal override int Delete(string tableName, SimpleExpression criteria) + { + return _adapter.Delete(tableName, criteria); + } + } } \ No newline at end of file diff --git a/Simple.Data/DynamicTable.cs b/Simple.Data/DynamicTable.cs index 4c98eb90..b773fa4f 100644 --- a/Simple.Data/DynamicTable.cs +++ b/Simple.Data/DynamicTable.cs @@ -1,194 +1,195 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Text; -using System.Dynamic; -using Simple.Data.Commands; -using Simple.Data.Extensions; - -namespace Simple.Data -{ - using System.Collections; - - /// - /// Represents a table in a database, or the nearest equivalent in other data stores. - /// - public class DynamicTable : DynamicObject - { - private readonly Dictionary> _delegates; - - private readonly ICollection _delegatesAsCollection; - private readonly string _tableName; - private readonly DynamicSchema _schema; - private readonly DataStrategy _dataStrategy; - - /// - /// Initializes a new instance of the class. - /// - /// Name of the table. - /// The database which owns the table. - internal DynamicTable(string tableName, DataStrategy dataStrategy) - : this(tableName, dataStrategy, null) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// Name of the table. - /// The database which owns the table. - /// The schema to which the table belongs. - internal DynamicTable(string tableName, DataStrategy dataStrategy, DynamicSchema schema) - { - _delegates = new Dictionary>(); - _delegatesAsCollection = _delegates; - _tableName = tableName; - _schema = schema; - _dataStrategy = dataStrategy; - } - - /// - /// Provides the implementation for operations that invoke a member. Classes derived from the class can override this method to specify dynamic behavior for operations such as calling a method. - /// - /// Provides information about the dynamic operation. The binder.Name property provides the name of the member on which the dynamic operation is performed. For example, for the statement sampleObject.SampleMethod(100), where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleMethod". The binder.IgnoreCase property specifies whether the member name is case-sensitive. - /// The arguments that are passed to the object member during the invoke operation. For example, for the statement sampleObject.SampleMethod(100), where sampleObject is derived from the class, is equal to 100. - /// The result of the member invocation. - /// - /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a language-specific run-time exception is thrown.) - /// - public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) - { - var signature = FunctionSignature.FromBinder(binder, args); - Func func; - if (_delegatesAsCollection.IsSynchronized && _delegates.ContainsKey(signature)) - { - func = _delegates[signature]; - } - else - { - lock (_delegatesAsCollection.SyncRoot) - { - if (!_delegates.ContainsKey(signature)) - { - func = CreateMemberDelegate(signature, binder, args); - _delegates.Add(signature, func); - } - else - { - func = _delegates[signature]; - } - } - } - if (func != null) - { - result = func(args); - return true; - } - - var command = CommandFactory.GetCommandFor(binder.Name); - if (command != null) - { - result = command.Execute(_dataStrategy, this, binder, args); - return true; - } - - var query = new SimpleQuery(_dataStrategy, _tableName); - if (query.TryInvokeMember(binder, args, out result)) - { - return true; - } - - if (base.TryInvokeMember(binder, args, out result)) return true; - - throw new InvalidOperationException(string.Format("Method {0} not recognised", binder.Name)); - } - - private Func CreateMemberDelegate(string signature, InvokeMemberBinder binder, object[] args) - { - try - { - var delegateCreatingCommand = CommandFactory.GetCommandFor(binder.Name) as ICreateDelegate; - if (delegateCreatingCommand == null) return null; - return delegateCreatingCommand.CreateDelegate(_dataStrategy, this, binder, args); - } - catch (NotImplementedException) - { - return null; - } - } - - /// - /// Provides the implementation for operations that get member values. Classes derived from the class can override this method to specify dynamic behavior for operations such as getting a value for a property. - /// - /// Provides information about the object that called the dynamic operation. The binder.Name property provides the name of the member on which the dynamic operation is performed. For example, for the Console.WriteLine(sampleObject.SampleProperty) statement, where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleProperty". The binder.IgnoreCase property specifies whether the member name is case-sensitive. - /// The result of the get operation. For example, if the method is called for a property, you can assign the property value to . - /// - /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a run-time exception is thrown.) - /// - public override bool TryGetMember(GetMemberBinder binder, out object result) - { - if (binder.Name == "All") - { - SimpleDataTraceSources.TraceSource.TraceEvent(TraceEventType.Warning, SimpleDataTraceSources.ObsoleteWarningMessageId, - "The dynamic 'All' property is deprecated; use the 'All()' method instead."); - result = GetAll().ToList(); - return true; - } - result = new ObjectReference(binder.Name, new ObjectReference(_tableName, (_schema != null ? new ObjectReference(_schema.GetName()) : null), _dataStrategy)); - return true; - } - - public override bool TrySetMember(SetMemberBinder binder, object value) - { - if (base.TrySetMember(binder, value)) - { - return true; - } - throw new BadExpressionException("Cannot assign values to table columns."); - } - - public ObjectReference As(string alias) - { - return new ObjectReference(_tableName, (_schema != null ? new ObjectReference(_schema.GetName()) : null), _dataStrategy, alias); - } - - public ObjectReference this[string name] - { - get { return new ObjectReference(name, new ObjectReference(_tableName, (_schema != null ? new ObjectReference(_schema.GetName()) : null), _dataStrategy)); } - } - - internal string GetName() - { - return _tableName; - } - - internal string GetQualifiedName() - { - return _schema != null ? _schema.GetName() + "." + _tableName : _tableName; - } - - private IEnumerable GetAll() - { - return _dataStrategy.Run.Find(_tableName, null).Select(dict => new SimpleRecord(dict, _tableName, _dataStrategy)); - } - - public AllColumnsSpecialReference AllColumns() - { - return new AllColumnsSpecialReference(this.ToObjectReference()); - } - - public AllColumnsSpecialReference Star() - { - return AllColumns(); - } - - internal ObjectReference ToObjectReference() - { - if (_schema == null) return new ObjectReference(_tableName, _dataStrategy); - var schemaReference = new ObjectReference(_schema.GetName(), _dataStrategy); - return new ObjectReference(_tableName, schemaReference, _dataStrategy); - } - } -} +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Dynamic; +using Simple.Data.Commands; +using Simple.Data.Extensions; +using Simple.Data.Operations; + +namespace Simple.Data +{ + using System.Collections; + + /// + /// Represents a table in a database, or the nearest equivalent in other data stores. + /// + public class DynamicTable : DynamicObject + { + private readonly Dictionary> _delegates; + + private readonly ICollection _delegatesAsCollection; + private readonly string _tableName; + private readonly DynamicSchema _schema; + private readonly DataStrategy _dataStrategy; + + /// + /// Initializes a new instance of the class. + /// + /// Name of the table. + /// The database which owns the table. + internal DynamicTable(string tableName, DataStrategy dataStrategy) + : this(tableName, dataStrategy, null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// Name of the table. + /// The database which owns the table. + /// The schema to which the table belongs. + internal DynamicTable(string tableName, DataStrategy dataStrategy, DynamicSchema schema) + { + _delegates = new Dictionary>(); + _delegatesAsCollection = _delegates; + _tableName = tableName; + _schema = schema; + _dataStrategy = dataStrategy; + } + + /// + /// Provides the implementation for operations that invoke a member. Classes derived from the class can override this method to specify dynamic behavior for operations such as calling a method. + /// + /// Provides information about the dynamic operation. The binder.Name property provides the name of the member on which the dynamic operation is performed. For example, for the statement sampleObject.SampleMethod(100), where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleMethod". The binder.IgnoreCase property specifies whether the member name is case-sensitive. + /// The arguments that are passed to the object member during the invoke operation. For example, for the statement sampleObject.SampleMethod(100), where sampleObject is derived from the class, is equal to 100. + /// The result of the member invocation. + /// + /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a language-specific run-time exception is thrown.) + /// + public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) + { + var signature = FunctionSignature.FromBinder(binder, args); + Func func; + if (_delegatesAsCollection.IsSynchronized && _delegates.ContainsKey(signature)) + { + func = _delegates[signature]; + } + else + { + lock (_delegatesAsCollection.SyncRoot) + { + if (!_delegates.ContainsKey(signature)) + { + func = CreateMemberDelegate(signature, binder, args); + _delegates.Add(signature, func); + } + else + { + func = _delegates[signature]; + } + } + } + if (func != null) + { + result = func(args); + return true; + } + + var command = CommandFactory.GetCommandFor(binder.Name); + if (command != null) + { + result = command.Execute(_dataStrategy, this, binder, args); + return true; + } + + var query = new SimpleQuery(_dataStrategy, _tableName); + if (query.TryInvokeMember(binder, args, out result)) + { + return true; + } + + if (base.TryInvokeMember(binder, args, out result)) return true; + + throw new InvalidOperationException(string.Format("Method {0} not recognised", binder.Name)); + } + + private Func CreateMemberDelegate(string signature, InvokeMemberBinder binder, object[] args) + { + try + { + var delegateCreatingCommand = CommandFactory.GetCommandFor(binder.Name) as ICreateDelegate; + if (delegateCreatingCommand == null) return null; + return delegateCreatingCommand.CreateDelegate(_dataStrategy, this, binder, args); + } + catch (NotImplementedException) + { + return null; + } + } + + /// + /// Provides the implementation for operations that get member values. Classes derived from the class can override this method to specify dynamic behavior for operations such as getting a value for a property. + /// + /// Provides information about the object that called the dynamic operation. The binder.Name property provides the name of the member on which the dynamic operation is performed. For example, for the Console.WriteLine(sampleObject.SampleProperty) statement, where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleProperty". The binder.IgnoreCase property specifies whether the member name is case-sensitive. + /// The result of the get operation. For example, if the method is called for a property, you can assign the property value to . + /// + /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a run-time exception is thrown.) + /// + public override bool TryGetMember(GetMemberBinder binder, out object result) + { + if (binder.Name == "All") + { + SimpleDataTraceSources.TraceSource.TraceEvent(TraceEventType.Warning, SimpleDataTraceSources.ObsoleteWarningMessageId, + "The dynamic 'All' property is deprecated; use the 'All()' method instead."); + result = GetAll().ToList(); + return true; + } + result = new ObjectReference(binder.Name, new ObjectReference(_tableName, (_schema != null ? new ObjectReference(_schema.GetName()) : null), _dataStrategy)); + return true; + } + + public override bool TrySetMember(SetMemberBinder binder, object value) + { + if (base.TrySetMember(binder, value)) + { + return true; + } + throw new BadExpressionException("Cannot assign values to table columns."); + } + + public ObjectReference As(string alias) + { + return new ObjectReference(_tableName, (_schema != null ? new ObjectReference(_schema.GetName()) : null), _dataStrategy, alias); + } + + public ObjectReference this[string name] + { + get { return new ObjectReference(name, new ObjectReference(_tableName, (_schema != null ? new ObjectReference(_schema.GetName()) : null), _dataStrategy)); } + } + + internal string GetName() + { + return _tableName; + } + + internal string GetQualifiedName() + { + return _schema != null ? _schema.GetName() + "." + _tableName : _tableName; + } + + private IEnumerable GetAll() + { + return _dataStrategy.Run.Find(new FindOperation(_tableName, null)).Select(dict => new SimpleRecord(dict, _tableName, _dataStrategy)); + } + + public AllColumnsSpecialReference AllColumns() + { + return new AllColumnsSpecialReference(this.ToObjectReference()); + } + + public AllColumnsSpecialReference Star() + { + return AllColumns(); + } + + internal ObjectReference ToObjectReference() + { + if (_schema == null) return new ObjectReference(_tableName, _dataStrategy); + var schemaReference = new ObjectReference(_schema.GetName(), _dataStrategy); + return new ObjectReference(_tableName, schemaReference, _dataStrategy); + } + } +} diff --git a/Simple.Data/EnumerableEx.cs b/Simple.Data/EnumerableEx.cs index aa840b63..924efabc 100644 --- a/Simple.Data/EnumerableEx.cs +++ b/Simple.Data/EnumerableEx.cs @@ -1,15 +1,50 @@ -using System; -using System.Collections.Generic; - -namespace Simple.Data -{ - public static class EnumerableEx - { - public static Func> ToIterator(this IEnumerable source) - { - var enumerator = source.GetEnumerator(); - return - () => enumerator.MoveNext() ? enumerator.Current : Maybe.None; - } - } -} +using System; +using System.Collections.Generic; + +namespace Simple.Data +{ + using System.Collections.ObjectModel; + + public static class EnumerableEx + { + public static Func> ToIterator(this IEnumerable source) + { + var enumerator = source.GetEnumerator(); + return + () => enumerator.MoveNext() ? enumerator.Current : Maybe.None; + } + + public static IReadOnlyDictionary ToReadOnlyDictionary( + this IEnumerable> source) + { + return ToReadOnlyDictionary(source, EqualityComparer.Default); + } + + public static IReadOnlyDictionary ToReadOnlyDictionary( + this IEnumerable> source, IEqualityComparer comparer) + { + ICollection> dict = new Dictionary(comparer); + foreach (var pair in source) + { + dict.Add(pair); + } + return new ReadOnlyDictionary((IDictionary) dict); + } + + public static IEnumerable Once(T item) + { + yield return item; + } + + public static IDictionary ToDictionary( + this IEnumerable> sourcePairs) + { + ICollection> dict = new Dictionary(); + foreach (var pair in sourcePairs) + { + dict.Add(pair); + } + return (IDictionary) dict; + } + } +} diff --git a/Simple.Data/Extensions/ObjectEx.cs b/Simple.Data/Extensions/ObjectEx.cs index 5ca912d1..7247552b 100644 --- a/Simple.Data/Extensions/ObjectEx.cs +++ b/Simple.Data/Extensions/ObjectEx.cs @@ -1,73 +1,80 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Simple.Data.Extensions -{ - using System.Collections.Concurrent; - using System.Linq.Expressions; - using System.Reflection; - - public static class ObjectEx - { - private static readonly ConcurrentDictionary>> Converters = - new ConcurrentDictionary>>(); - - public static IDictionary AnonymousObjectToDictionary(this object obj) - { - return obj.GetType().GetProperties().ToDictionary(p => p.Name, p => p.GetValue(obj, null)); - } - - public static IDictionary ObjectToDictionary(this object obj) - { - if (obj == null) return new Dictionary(); - - var alreadyADictionary = obj as IDictionary; - - if (alreadyADictionary != null) - { - return new Dictionary(alreadyADictionary); - } - - return Converters.GetOrAdd(obj.GetType(), MakeToDictionaryFunc)(obj); - } - - private static Func> MakeToDictionaryFunc(Type type) - { - var param = Expression.Parameter(typeof(object)); - var typed = Expression.Variable(type); - var newDict = Expression.New(typeof(Dictionary)); - var elementInitsForType = GetElementInitsForType(type, typed); - var listInit = Expression.ListInit(newDict, elementInitsForType); - - var block = Expression.Block(new[] { typed }, - Expression.Assign(typed, Expression.Convert(param, type)), - listInit); - - return Expression.Lambda>>(block, param).Compile(); - } - - static readonly MethodInfo DictionaryAddMethod = typeof(Dictionary).GetMethod("Add"); - - static IEnumerable GetElementInitsForType(Type type, Expression param) - { - return type.GetProperties(BindingFlags.Instance | BindingFlags.Public) - .Where(p => p.CanRead) - .Select(p => PropertyToElementInit(p, param)); - } - - static ElementInit PropertyToElementInit(PropertyInfo propertyInfo, Expression instance) - { - return Expression.ElementInit(DictionaryAddMethod, - Expression.Constant(propertyInfo.Name), - Expression.Convert(Expression.Property(instance, propertyInfo), typeof(object))); - } - - internal static bool IsAnonymous(this object obj) - { - if (obj == null) return false; - return obj.GetType().Namespace == null; - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Simple.Data.Extensions +{ + using System.Collections.Concurrent; + using System.Collections.ObjectModel; + using System.Linq.Expressions; + using System.Reflection; + + public static class ObjectEx + { + private static readonly ConcurrentDictionary>> Converters = + new ConcurrentDictionary>>(); + + public static IReadOnlyDictionary AnonymousObjectToDictionary(this object obj) + { + return obj.GetType().GetProperties().ToDictionary(p => p.Name, p => p.GetValue(obj, null)); + } + + public static IReadOnlyDictionary ObjectToDictionary(this object obj) + { + if (obj == null) return new Dictionary(); + + var alreadyAReadOnlyDictionary = obj as IReadOnlyDictionary; + + if (alreadyAReadOnlyDictionary != null) + { + return alreadyAReadOnlyDictionary; + } + + var alreadyADictionary = obj as IDictionary; + if (alreadyADictionary != null) + { + return new ReadOnlyDictionary(alreadyADictionary); + } + + return Converters.GetOrAdd(obj.GetType(), MakeToDictionaryFunc)(obj); + } + + private static Func> MakeToDictionaryFunc(Type type) + { + var param = Expression.Parameter(typeof(object)); + var typed = Expression.Variable(type); + var newDict = Expression.New(typeof(Dictionary)); + var elementInitsForType = GetElementInitsForType(type, typed); + var listInit = Expression.ListInit(newDict, elementInitsForType); + + var block = Expression.Block(new[] { typed }, + Expression.Assign(typed, Expression.Convert(param, type)), + listInit); + + return Expression.Lambda>>(block, param).Compile(); + } + + static readonly MethodInfo DictionaryAddMethod = typeof(Dictionary).GetMethod("Add"); + + static IEnumerable GetElementInitsForType(Type type, Expression param) + { + return type.GetProperties(BindingFlags.Instance | BindingFlags.Public) + .Where(p => p.CanRead) + .Select(p => PropertyToElementInit(p, param)); + } + + static ElementInit PropertyToElementInit(PropertyInfo propertyInfo, Expression instance) + { + return Expression.ElementInit(DictionaryAddMethod, + Expression.Constant(propertyInfo.Name), + Expression.Convert(Expression.Property(instance, propertyInfo), typeof(object))); + } + + internal static bool IsAnonymous(this object obj) + { + if (obj == null) return false; + return obj.GetType().Namespace == null; + } + } +} diff --git a/Simple.Data/IAdapterWithFunctions.cs b/Simple.Data/IAdapterWithFunctions.cs index ac8c551a..1b2bd93b 100644 --- a/Simple.Data/IAdapterWithFunctions.cs +++ b/Simple.Data/IAdapterWithFunctions.cs @@ -1,19 +1,19 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using ResultSet = System.Collections.Generic.IEnumerable>>; - -namespace Simple.Data -{ - /// - /// Represents an Adapter which supports functions; for example, the Ado adapter supports this with Stored Procedures. - /// - /// It may be possible to add functions to access data-store specific functionality (CreateIndex?) with this interface. - public interface IAdapterWithFunctions - { - bool IsValidFunction(string functionName); - IEnumerable Execute(string functionName, IDictionary parameters); - IEnumerable Execute(string functionName, IDictionary parameters, IAdapterTransaction transaction); - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ResultSet = System.Collections.Generic.IEnumerable>>; + +namespace Simple.Data +{ + /// + /// Represents an Adapter which supports functions; for example, the Ado adapter supports this with Stored Procedures. + /// + /// It may be possible to add functions to access data-store specific functionality (CreateIndex?) with this interface. + public interface IAdapterWithFunctions + { + bool IsValidFunction(string functionName); + IEnumerable Execute(string functionName, IReadOnlyDictionary parameters); + IEnumerable Execute(string functionName, IReadOnlyDictionary parameters, IAdapterTransaction transaction); + } +} diff --git a/Simple.Data/IAdapterWithTransactions.cs b/Simple.Data/IAdapterWithTransactions.cs index fcf101f8..506bb57d 100644 --- a/Simple.Data/IAdapterWithTransactions.cs +++ b/Simple.Data/IAdapterWithTransactions.cs @@ -1,72 +1,64 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using System.Text; - -namespace Simple.Data -{ - public interface IAdapterWithTransactions - { - IAdapterTransaction BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.Unspecified); - IAdapterTransaction BeginTransaction(string name, IsolationLevel isolationLevel = IsolationLevel.Unspecified); - - /// - /// Finds data from the specified "table". - /// - /// Name of the table.The criteria. This may be null, in which case all records should be returned. - /// The transaction with which the operation is associated. - /// The list of records matching the criteria. If no records are found, return an empty list. - IEnumerable> Find(string tableName, SimpleExpression criteria, IAdapterTransaction transaction); - - /// - /// Inserts a record into the specified "table". - /// - /// Name of the table.The values to insert. - /// The transaction with which the operation is associated. - /// If possible, return the newly inserted row, including any automatically-set values such as primary keys or timestamps. - IDictionary Insert(string tableName, IDictionary data, IAdapterTransaction transaction, bool resultRequired); - - /// - /// Inserts many records into the specified "table". - /// - /// Name of the table. - /// The list of records to insert. - /// The transaction with which the operation is associated. - /// If possible, return the newly inserted rows, including any automatically-set values such as primary keys or timestamps. - IEnumerable> InsertMany(string tableName, IEnumerable> data, IAdapterTransaction transaction, Func,Exception,bool> onError, bool resultRequired); - - /// - /// Updates the specified "table" according to specified criteria. - /// - /// Name of the table.The new values.The expression to use as criteria for the update operation. - /// The transaction with which the operation is associated. - /// The number of records affected by the update operation. - int Update(string tableName, IDictionary data, SimpleExpression criteria, IAdapterTransaction transaction); - - /// - /// Deletes from the specified table. - /// - /// Name of the table.The expression to use as criteria for the delete operation. - /// The transaction with which the operation is associated. - /// The number of records which were deleted. - int Delete(string tableName, SimpleExpression criteria, IAdapterTransaction transaction); - - /// - /// Updates the specified "table" according to primary key information where available. - /// - /// Name of the table.The new values. - /// The transaction with which the operation is associated. - /// The number of records affected by the update operation. - int UpdateMany(string tableName, IEnumerable> dataList, IAdapterTransaction adapterTransaction); - - int UpdateMany(string tableName, IEnumerable> dataList, IAdapterTransaction adapterTransaction, IList keyFields); - - int UpdateMany(string tableName, IList> dataList, IEnumerable criteriaFieldNames, IAdapterTransaction adapterTransaction); - IDictionary Upsert(string tableName, IDictionary dict, SimpleExpression criteriaExpression, bool isResultRequired, IAdapterTransaction adapterTransaction); - IEnumerable> UpsertMany(string tableName, IList> list, IEnumerable keyFieldNames, IAdapterTransaction adapterTransaction, bool isResultRequired, Func,Exception,bool> errorCallback); - IEnumerable> UpsertMany(string tableName, IList> list, IAdapterTransaction adapterTransaction, bool isResultRequired, Func, Exception, bool> errorCallback); - IDictionary Get(string tableName, IAdapterTransaction transaction, params object[] parameterValues); - IEnumerable> RunQuery(SimpleQuery query, IAdapterTransaction transaction, out IEnumerable unhandledClauses); - } -} +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using Simple.Data.Operations; + +namespace Simple.Data +{ + public interface IAdapterWithTransactions + { + IAdapterTransaction BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.Unspecified); + IAdapterTransaction BeginTransaction(string name, IsolationLevel isolationLevel = IsolationLevel.Unspecified); + + /// + /// Finds data from the specified "table". + /// + /// Operation details. + /// The transaction with which the operation is associated. + /// The list of records matching the criteria. If no records are found, return an empty list. + IEnumerable> Find(FindOperation operation, IAdapterTransaction transaction); + + /// + /// Inserts a record into the specified "table". + /// + /// + /// The transaction with which the operation is associated. + /// If possible and required, return the newly inserted row(s), including any automatically-set values such as primary keys or timestamps. + IEnumerable> Insert(InsertOperation operation, IAdapterTransaction transaction); + + /// + /// Updates the specified "table" according to specified criteria. + /// + /// Name of the table.The new values.The expression to use as criteria for the update operation. + /// The transaction with which the operation is associated. + /// The number of records affected by the update operation. + int Update(string tableName, IReadOnlyDictionary data, SimpleExpression criteria, IAdapterTransaction transaction); + + /// + /// Deletes from the specified table. + /// + /// Name of the table.The expression to use as criteria for the delete operation. + /// The transaction with which the operation is associated. + /// The number of records which were deleted. + int Delete(string tableName, SimpleExpression criteria, IAdapterTransaction transaction); + + /// + /// Updates the specified "table" according to primary key information where available. + /// + /// Name of the table.The new values. + /// The transaction with which the operation is associated. + /// The number of records affected by the update operation. + int UpdateMany(string tableName, IEnumerable> dataList, IAdapterTransaction adapterTransaction); + + int UpdateMany(string tableName, IEnumerable> dataList, IAdapterTransaction adapterTransaction, IList keyFields); + + int UpdateMany(string tableName, IList> dataList, IEnumerable criteriaFieldNames, IAdapterTransaction adapterTransaction); + + IEnumerable> Upsert(UpsertOperation operation, + IAdapterTransaction transaction); + IReadOnlyDictionary Get(GetOperation operation, IAdapterTransaction transaction); + IEnumerable> RunQuery(SimpleQuery query, IAdapterTransaction transaction, out IEnumerable unhandledClauses); + } +} diff --git a/Simple.Data/InMemoryAdapter.cs b/Simple.Data/InMemoryAdapter.cs index 0a82b0a3..d6c49a5d 100644 --- a/Simple.Data/InMemoryAdapter.cs +++ b/Simple.Data/InMemoryAdapter.cs @@ -1,419 +1,418 @@ -namespace Simple.Data -{ - using System; - using System.Collections.Generic; - using System.Collections.ObjectModel; - using System.Linq; - using QueryPolyfills; - - public partial class InMemoryAdapter : Adapter, IAdapterWithFunctions - { - private readonly Dictionary _autoIncrementColumns; - private readonly Dictionary _keyColumns; - - private readonly Dictionary>> _tables; - - [Flags] - private enum FunctionFlags - { - None = 0x00000000, - PassThru = 0x00000001 - } - - private class FunctionInfo - { - public FunctionInfo(Delegate func, FunctionFlags flags) - { - Delegate = func; - Flags = flags; - } - - public Delegate Delegate { get; private set; } - public FunctionFlags Flags { get; private set; } - } - - private readonly Dictionary _functions = new Dictionary(); - - private readonly ICollection _joins = new Collection(); - - public InMemoryAdapter() : this(StringComparer.OrdinalIgnoreCase) - { - } - - public InMemoryAdapter(IEqualityComparer nameComparer) - { - _nameComparer = nameComparer; - _keyColumns = new Dictionary(_nameComparer); - _autoIncrementColumns = new Dictionary(_nameComparer); - _tables = new Dictionary>>(nameComparer); - } - - private List> GetTable(string tableName) - { - tableName = tableName.ToLowerInvariant(); - if (!_tables.ContainsKey(tableName)) _tables.Add(tableName, new List>()); - return _tables[tableName]; - } - - public override IDictionary GetKey(string tableName, IDictionary record) - { - if (!_keyColumns.ContainsKey(tableName)) return null; - return _keyColumns[tableName].ToDictionary(key => key, key => record.ContainsKey(key) ? record[key] : null); - } - - public override IList GetKeyNames(string tableName) - { - if (!_keyColumns.ContainsKey(tableName)) return null; - return _keyColumns[tableName]; - } - - public override IDictionary Get(string tableName, params object[] keyValues) - { - if (!_keyColumns.ContainsKey(tableName)) throw new InvalidOperationException("No key specified for In-Memory table."); - var keys = _keyColumns[tableName]; - if (keys.Length != keyValues.Length) throw new ArgumentException("Incorrect number of values for key."); - var expression = new ObjectReference(keys[0]) == keyValues[0]; - for (int i = 1; i < keyValues.Length; i++) - { - expression = expression && new ObjectReference(keys[i]) == keyValues[i]; - } - - return Find(tableName, expression).FirstOrDefault(); - } - - public override IEnumerable> Find(string tableName, SimpleExpression criteria) - { - var whereClauseHandler = new WhereClauseHandler(tableName, new WhereClause(criteria)); - return whereClauseHandler.Run(GetTable(tableName)); - } - - public override IEnumerable> RunQuery(SimpleQuery query, - out IEnumerable - unhandledClauses) - { - unhandledClauses = query.Clauses.AsEnumerable(); - return GetTable(query.TableName); - } - - public override IDictionary Insert(string tableName, IDictionary data, bool resultRequired) - { - data = new Dictionary(data, _nameComparer); - if (_autoIncrementColumns.ContainsKey(tableName)) - { - var table = GetTable(tableName); - var autoIncrementColumn = _autoIncrementColumns[tableName]; - - if(!data.ContainsKey(autoIncrementColumn)) - { - data.Add(autoIncrementColumn, 0); - } - - object nextVal = 0; - if(table.Count > 0) - { - nextVal = table.Select(d => d[autoIncrementColumn]).Max(); - } - - nextVal = ObjectMaths.Increment(nextVal); - data[autoIncrementColumn] = nextVal; - } - - GetTable(tableName).Add(data); - - AddAsDetail(tableName, data); - AddAsMaster(tableName, data); - - return data; - } - - private void AddAsDetail(string tableName, IDictionary data) - { - foreach (var @join in _joins.Where(j => j.DetailTableName.Equals(tableName, StringComparison.OrdinalIgnoreCase))) - { - if (!data.ContainsKey(@join.DetailKey)) continue; - foreach ( - var master in - GetTable(@join.MasterTableName).Where( - d => d.ContainsKey(@join.MasterKey) && d[@join.MasterKey].Equals(data[@join.DetailKey]))) - { - data[@join.MasterPropertyName] = master; - if (!master.ContainsKey(@join.DetailPropertyName)) - { - master.Add(@join.DetailPropertyName, new List> {data}); - } - else - { - ((List>) master[@join.DetailPropertyName]).Add(data); - } - } - } - } - - private void AddAsMaster(string tableName, IDictionary data) - { - foreach (var @join in _joins.Where(j => j.MasterTableName.Equals(tableName, StringComparison.OrdinalIgnoreCase))) - { - if (!data.ContainsKey(@join.MasterKey)) continue; - foreach ( - var detail in - GetTable(@join.DetailTableName).Where( - d => d.ContainsKey(@join.DetailKey) && d[@join.DetailKey].Equals(data[@join.MasterKey]))) - { - detail[@join.MasterPropertyName] = data; - if (!data.ContainsKey(@join.DetailPropertyName)) - { - data.Add(@join.DetailPropertyName, new List> {data}); - } - else - { - ((List>) data[@join.DetailPropertyName]).Add(data); - } - } - } - } - - public override int Update(string tableName, IDictionary data, SimpleExpression criteria) - { - int count = 0; - foreach (var record in Find(tableName, criteria)) - { - UpdateRecord(data, record); - ++count; - } - return count; - } - - private static void UpdateRecord(IEnumerable> data, IDictionary record) - { - foreach (var kvp in data) - { - record[kvp.Key] = kvp.Value; - } - } - - public override int Delete(string tableName, SimpleExpression criteria) - { - List> deletions = Find(tableName, criteria).ToList(); - foreach (var record in deletions) - { - GetTable(tableName).Remove(record); - } - return deletions.Count; - } - - public override bool IsExpressionFunction(string functionName, params object[] args) - { - return (functionName.Equals("like", StringComparison.OrdinalIgnoreCase) || - functionName.Equals("notlike", StringComparison.OrdinalIgnoreCase)) - && args.Length == 1 - && args[0] is string; - } - - public void SetAutoIncrementColumn(string tableName, string columnName) - { - _autoIncrementColumns.Add(tableName, columnName); - } - - public void SetKeyColumn(string tableName, string columnName) - { - _keyColumns[tableName] = new[] {columnName}; - } - - public void SetAutoIncrementKeyColumn(string tableName, string columnName) - { - SetKeyColumn(tableName, columnName); - SetAutoIncrementColumn(tableName, columnName); - } - - public void SetKeyColumns(string tableName, params string[] columnNames) - { - _keyColumns[tableName] = columnNames; - } - - /// - /// Set up an implicit join between two tables. - /// - /// The name of the 'master' table - /// The 'primary key' - /// The name to give the lookup property in the detail objects - /// The name of the 'master' table - /// The 'foreign key' - /// The name to give the collection property in the master object - public void ConfigureJoin(string masterTableName, string masterKey, string masterPropertyName, string detailTableName, string detailKey, string detailPropertyName) - { - var join = new JoinInfo(masterTableName, masterKey, masterPropertyName, detailTableName, detailKey, - detailPropertyName); - _joins.Add(join); - } - - public JoinConfig Join - { - get { return new JoinConfig(_joins);} - } - - private IEqualityComparer _nameComparer = EqualityComparer.Default; - - internal class JoinInfo - { - private readonly string _masterTableName; - private readonly string _masterKey; - private readonly string _masterPropertyName; - private readonly string _detailTableName; - private readonly string _detailKey; - private readonly string _detailPropertyName; - - public JoinInfo(string masterTableName, string masterKey, string masterPropertyName, string detailTableName, string detailKey, string detailPropertyName) - { - _masterTableName = masterTableName; - _masterKey = masterKey; - _masterPropertyName = masterPropertyName; - _detailTableName = detailTableName; - _detailKey = detailKey; - _detailPropertyName = detailPropertyName; - } - - public string DetailPropertyName - { - get { return _detailPropertyName; } - } - - public string DetailKey - { - get { return _detailKey; } - } - - public string DetailTableName - { - get { return _detailTableName; } - } - - public string MasterPropertyName - { - get { return _masterPropertyName; } - } - - public string MasterKey - { - get { return _masterKey; } - } - - public string MasterTableName - { - get { return _masterTableName; } - } - } - - public override IDictionary Upsert(string tableName, IDictionary dict, SimpleExpression criteriaExpression, bool isResultRequired, IAdapterTransaction adapterTransaction) - { - return Upsert(tableName, dict, criteriaExpression, isResultRequired); - } - - public override IEnumerable> UpsertMany(string tableName, IList> list, IEnumerable keyFieldNames, IAdapterTransaction adapterTransaction, bool isResultRequired, Func,Exception,bool> errorCallback) - { - return UpsertMany(tableName, list, keyFieldNames, isResultRequired, errorCallback); - } - - public override IEnumerable> UpsertMany(string tableName, IList> list, IAdapterTransaction adapterTransaction, bool isResultRequired, Func, Exception, bool> errorCallback) - { - return UpsertMany(tableName, list, isResultRequired, errorCallback); - } - - public IDictionary Get(string tableName, IAdapterTransaction transaction, params object[] parameterValues) - { - return Get(tableName, parameterValues); - } - - public class JoinConfig - { - private readonly ICollection _joins; - private JoinInfo _joinInfo; - - internal JoinConfig(ICollection joins) - { - _joins = joins; - _joinInfo = new JoinInfo(null,null,null,null,null,null); - } - - public JoinConfig Master(string tableName, string keyName, string propertyNameInDetailRecords = null) - { - if (_joins.Contains(_joinInfo)) _joins.Remove(_joinInfo); - _joinInfo = new JoinInfo(tableName, keyName, propertyNameInDetailRecords ?? tableName, _joinInfo.DetailTableName, - _joinInfo.DetailKey, _joinInfo.DetailPropertyName); - _joins.Add(_joinInfo); - return this; - } - - - public JoinConfig Detail(string tableName, string keyName, string propertyNameInMasterRecords = null) - { - if (_joins.Contains(_joinInfo)) _joins.Remove(_joinInfo); - _joinInfo = new JoinInfo(_joinInfo.MasterTableName, _joinInfo.MasterKey, _joinInfo.MasterPropertyName, - tableName, keyName, - propertyNameInMasterRecords ?? tableName); - _joins.Add(_joinInfo); - return this; - } - } - - public void AddFunction(string functionName, Func function) - { - _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); - } - - public void AddFunction(string functionName, Func function) - { - _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); - } - - public void AddFunction(string functionName, Func function) - { - _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); - } - - public void AddFunction(string functionName, Func function) - { - _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); - } - - public void AddFunction(string functionName, Func function) - { - _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); - } - - public void AddDelegate(string functionName, Delegate function) - { - _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); - } - - public void AddFunction(string functionName, Func, TResult> function) - { - _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.PassThru)); - } - - public bool IsValidFunction(string functionName) - { - return _functions.ContainsKey(functionName); - } - - public IEnumerable>>> Execute(string functionName, IDictionary parameters) - { - if (!_functions.ContainsKey(functionName)) throw new InvalidOperationException(string.Format("Function '{0}' not found.", functionName)); - var obj = ((_functions[functionName].Flags & FunctionFlags.PassThru) == FunctionFlags.PassThru) ? - _functions[functionName].Delegate.DynamicInvoke(parameters) : - _functions[functionName].Delegate.DynamicInvoke(parameters.Values.ToArray()); - - var dict = obj as IDictionary; - if (dict != null) return new List>> { new List> { dict } }; - - var list = obj as IEnumerable>; - if (list != null) return new List>> { list }; - - return obj as IEnumerable>>; - } - - public IEnumerable>>> Execute(string functionName, IDictionary parameters, IAdapterTransaction transaction) - { - return Execute(functionName, parameters); - } - } +using Simple.Data.Operations; + +namespace Simple.Data +{ + using System; + using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.Linq; + using QueryPolyfills; + + public partial class InMemoryAdapter : Adapter, IAdapterWithFunctions + { + private readonly Dictionary _autoIncrementColumns; + private readonly Dictionary _keyColumns; + + private readonly Dictionary>> _tables; + + [Flags] + private enum FunctionFlags + { + None = 0x00000000, + PassThru = 0x00000001 + } + + private class FunctionInfo + { + public FunctionInfo(Delegate func, FunctionFlags flags) + { + Delegate = func; + Flags = flags; + } + + public Delegate Delegate { get; private set; } + public FunctionFlags Flags { get; private set; } + } + + private readonly Dictionary _functions = new Dictionary(); + + private readonly ICollection _joins = new Collection(); + + public InMemoryAdapter() : this(StringComparer.OrdinalIgnoreCase) + { + } + + public InMemoryAdapter(IEqualityComparer nameComparer) + { + _nameComparer = nameComparer; + _keyColumns = new Dictionary(_nameComparer); + _autoIncrementColumns = new Dictionary(_nameComparer); + _tables = new Dictionary>>(nameComparer); + } + + private List> GetTable(string tableName) + { + tableName = tableName.ToLowerInvariant(); + if (!_tables.ContainsKey(tableName)) _tables.Add(tableName, new List>()); + return _tables[tableName]; + } + + public override IReadOnlyDictionary GetKey(string tableName, IReadOnlyDictionary record) + { + if (!_keyColumns.ContainsKey(tableName)) return null; + return _keyColumns[tableName].ToDictionary(key => key, key => record.ContainsKey(key) ? record[key] : null); + } + + public override IList GetKeyNames(string tableName) + { + if (!_keyColumns.ContainsKey(tableName)) return null; + return _keyColumns[tableName]; + } + + public override IReadOnlyDictionary Get(GetOperation operation) + { + if (!_keyColumns.ContainsKey(operation.TableName)) throw new InvalidOperationException("No key specified for In-Memory table."); + var keys = _keyColumns[operation.TableName]; + if (keys.Length != operation.KeyValues.Length) throw new ArgumentException("Incorrect number of values for key."); + var expression = new ObjectReference(keys[0]) == operation.KeyValues[0]; + for (int i = 1; i < operation.KeyValues.Length; i++) + { + expression = expression && new ObjectReference(keys[i]) == operation.KeyValues[i]; + } + + return new ReadOnlyDictionary(Find(operation.TableName, expression).FirstOrDefault()); + } + + public override IEnumerable> Find(FindOperation operation) + { + return Find(operation.TableName, operation.Criteria).Select(d => new ReadOnlyDictionary(d)); + } + + private IEnumerable> Find(string tableName, SimpleExpression criteria) + { + var whereClauseHandler = new WhereClauseHandler(tableName, new WhereClause(criteria)); + return whereClauseHandler.Run(GetTable(tableName)); + } + + public override IEnumerable> RunQuery(SimpleQuery query, + out IEnumerable + unhandledClauses) + { + unhandledClauses = query.Clauses.AsEnumerable(); + return GetTable(query.TableName); + } + + public override IEnumerable> Insert(InsertOperation operation) + { + foreach (var data in operation.Data.Select(d => d.ToDictionary(kvp => kvp.Key, kvp => kvp.Value))) + { + if (_autoIncrementColumns.ContainsKey(operation.TableName)) + { + var table = GetTable(operation.TableName); + var autoIncrementColumn = _autoIncrementColumns[operation.TableName]; + + if (!data.ContainsKey(autoIncrementColumn)) + { + data.Add(autoIncrementColumn, 0); + } + + object nextVal = 0; + if (table.Count > 0) + { + nextVal = table.Select(d => d[autoIncrementColumn]).Max(); + } + + nextVal = ObjectMaths.Increment(nextVal); + data[autoIncrementColumn] = nextVal; + } + + GetTable(operation.TableName).Add(data); + + AddAsDetail(operation.TableName, data); + AddAsMaster(operation.TableName, data); + + yield return data; + } + } + + private void AddAsDetail(string tableName, IDictionary data) + { + foreach (var @join in _joins.Where(j => j.DetailTableName.Equals(tableName, StringComparison.OrdinalIgnoreCase))) + { + if (!data.ContainsKey(@join.DetailKey)) continue; + foreach ( + var master in + GetTable(@join.MasterTableName).Where( + d => d.ContainsKey(@join.MasterKey) && d[@join.MasterKey].Equals(data[@join.DetailKey]))) + { + data[@join.MasterPropertyName] = master; + if (!master.ContainsKey(@join.DetailPropertyName)) + { + master.Add(@join.DetailPropertyName, new List> {data}); + } + else + { + ((List>) master[@join.DetailPropertyName]).Add(data); + } + } + } + } + + private void AddAsMaster(string tableName, IDictionary data) + { + foreach (var @join in _joins.Where(j => j.MasterTableName.Equals(tableName, StringComparison.OrdinalIgnoreCase))) + { + if (!data.ContainsKey(@join.MasterKey)) continue; + foreach ( + var detail in + GetTable(@join.DetailTableName).Where( + d => d.ContainsKey(@join.DetailKey) && d[@join.DetailKey].Equals(data[@join.MasterKey]))) + { + detail[@join.MasterPropertyName] = data; + if (!data.ContainsKey(@join.DetailPropertyName)) + { + data.Add(@join.DetailPropertyName, new List> {data}); + } + else + { + ((List>) data[@join.DetailPropertyName]).Add(data); + } + } + } + } + + public override int Update(string tableName, IReadOnlyDictionary data, SimpleExpression criteria) + { + int count = 0; + foreach (var record in Find(tableName, criteria)) + { + UpdateRecord(data, record); + ++count; + } + return count; + } + + private static void UpdateRecord(IEnumerable> data, IDictionary record) + { + foreach (var kvp in data) + { + record[kvp.Key] = kvp.Value; + } + } + + public override int Delete(string tableName, SimpleExpression criteria) + { + List> deletions = Find(tableName, criteria).ToList(); + foreach (var record in deletions) + { + GetTable(tableName).Remove(record); + } + return deletions.Count; + } + + public override bool IsExpressionFunction(string functionName, params object[] args) + { + return (functionName.Equals("like", StringComparison.OrdinalIgnoreCase) || + functionName.Equals("notlike", StringComparison.OrdinalIgnoreCase)) + && args.Length == 1 + && args[0] is string; + } + + public void SetAutoIncrementColumn(string tableName, string columnName) + { + _autoIncrementColumns.Add(tableName, columnName); + } + + public void SetKeyColumn(string tableName, string columnName) + { + _keyColumns[tableName] = new[] {columnName}; + } + + public void SetAutoIncrementKeyColumn(string tableName, string columnName) + { + SetKeyColumn(tableName, columnName); + SetAutoIncrementColumn(tableName, columnName); + } + + public void SetKeyColumns(string tableName, params string[] columnNames) + { + _keyColumns[tableName] = columnNames; + } + + /// + /// Set up an implicit join between two tables. + /// + /// The name of the 'master' table + /// The 'primary key' + /// The name to give the lookup property in the detail objects + /// The name of the 'master' table + /// The 'foreign key' + /// The name to give the collection property in the master object + public void ConfigureJoin(string masterTableName, string masterKey, string masterPropertyName, string detailTableName, string detailKey, string detailPropertyName) + { + var join = new JoinInfo(masterTableName, masterKey, masterPropertyName, detailTableName, detailKey, + detailPropertyName); + _joins.Add(join); + } + + public JoinConfig Join + { + get { return new JoinConfig(_joins);} + } + + private IEqualityComparer _nameComparer = EqualityComparer.Default; + + internal class JoinInfo + { + private readonly string _masterTableName; + private readonly string _masterKey; + private readonly string _masterPropertyName; + private readonly string _detailTableName; + private readonly string _detailKey; + private readonly string _detailPropertyName; + + public JoinInfo(string masterTableName, string masterKey, string masterPropertyName, string detailTableName, string detailKey, string detailPropertyName) + { + _masterTableName = masterTableName; + _masterKey = masterKey; + _masterPropertyName = masterPropertyName; + _detailTableName = detailTableName; + _detailKey = detailKey; + _detailPropertyName = detailPropertyName; + } + + public string DetailPropertyName + { + get { return _detailPropertyName; } + } + + public string DetailKey + { + get { return _detailKey; } + } + + public string DetailTableName + { + get { return _detailTableName; } + } + + public string MasterPropertyName + { + get { return _masterPropertyName; } + } + + public string MasterKey + { + get { return _masterKey; } + } + + public string MasterTableName + { + get { return _masterTableName; } + } + } + + public override IEnumerable> Upsert(UpsertOperation operation) + { + throw new NotImplementedException(); + } + + public IReadOnlyDictionary Get(GetOperation operation, IAdapterTransaction transaction) + { + return Get(operation); + } + + public class JoinConfig + { + private readonly ICollection _joins; + private JoinInfo _joinInfo; + + internal JoinConfig(ICollection joins) + { + _joins = joins; + _joinInfo = new JoinInfo(null,null,null,null,null,null); + } + + public JoinConfig Master(string tableName, string keyName, string propertyNameInDetailRecords = null) + { + if (_joins.Contains(_joinInfo)) _joins.Remove(_joinInfo); + _joinInfo = new JoinInfo(tableName, keyName, propertyNameInDetailRecords ?? tableName, _joinInfo.DetailTableName, + _joinInfo.DetailKey, _joinInfo.DetailPropertyName); + _joins.Add(_joinInfo); + return this; + } + + + public JoinConfig Detail(string tableName, string keyName, string propertyNameInMasterRecords = null) + { + if (_joins.Contains(_joinInfo)) _joins.Remove(_joinInfo); + _joinInfo = new JoinInfo(_joinInfo.MasterTableName, _joinInfo.MasterKey, _joinInfo.MasterPropertyName, + tableName, keyName, + propertyNameInMasterRecords ?? tableName); + _joins.Add(_joinInfo); + return this; + } + } + + public void AddFunction(string functionName, Func function) + { + _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); + } + + public void AddFunction(string functionName, Func function) + { + _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); + } + + public void AddFunction(string functionName, Func function) + { + _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); + } + + public void AddFunction(string functionName, Func function) + { + _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); + } + + public void AddFunction(string functionName, Func function) + { + _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); + } + + public void AddDelegate(string functionName, Delegate function) + { + _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); + } + + public void AddFunction(string functionName, Func, TResult> function) + { + _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.PassThru)); + } + + public bool IsValidFunction(string functionName) + { + return _functions.ContainsKey(functionName); + } + + public IEnumerable>>> Execute(string functionName, IReadOnlyDictionary parameters) + { + if (!_functions.ContainsKey(functionName)) throw new InvalidOperationException(string.Format("Function '{0}' not found.", functionName)); + var obj = ((_functions[functionName].Flags & FunctionFlags.PassThru) == FunctionFlags.PassThru) ? + _functions[functionName].Delegate.DynamicInvoke(parameters) : + _functions[functionName].Delegate.DynamicInvoke(parameters.Values.ToArray()); + + var dict = obj as IDictionary; + if (dict != null) return new List>> { new List> { dict } }; + + var list = obj as IEnumerable>; + if (list != null) return new List>> { list }; + + return obj as IEnumerable>>; + } + + public IEnumerable>>> Execute(string functionName, IReadOnlyDictionary parameters, IAdapterTransaction transaction) + { + return Execute(functionName, parameters); + } + } } \ No newline at end of file diff --git a/Simple.Data/InMemoryAdapterIAdapterWithTransactions.cs b/Simple.Data/InMemoryAdapterIAdapterWithTransactions.cs index 888a1c94..b5271de7 100644 --- a/Simple.Data/InMemoryAdapterIAdapterWithTransactions.cs +++ b/Simple.Data/InMemoryAdapterIAdapterWithTransactions.cs @@ -1,97 +1,99 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using System.Text; - -namespace Simple.Data -{ - public partial class InMemoryAdapter : IAdapterWithTransactions - { - class InMemoryAdapterTransaction : IAdapterTransaction - { - private readonly string _name; - - public InMemoryAdapterTransaction() : this(string.Empty) - { - } - - public InMemoryAdapterTransaction(string name) - { - _name = name; - } - - public void Dispose() - { - } - - public void Commit() - { - } - - public void Rollback() - { - } - - public string Name - { - get { return _name; } - } - } - - public IAdapterTransaction BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.Unspecified) - { - return new InMemoryAdapterTransaction(); - } - - public IAdapterTransaction BeginTransaction(string name, IsolationLevel isolationLevel = IsolationLevel.Unspecified) - { - return new InMemoryAdapterTransaction(name); - } - - public IEnumerable> Find(string tableName, SimpleExpression criteria, IAdapterTransaction transaction) - { - return Find(tableName, criteria); - } - - public IDictionary Insert(string tableName, IDictionary data, IAdapterTransaction transaction, bool resultRequired) - { - return Insert(tableName, data, resultRequired); - } - - public IEnumerable> InsertMany(string tableName, IEnumerable> data, IAdapterTransaction transaction, Func, Exception, bool> onError, bool resultRequired) - { - return InsertMany(tableName, data, onError, resultRequired); - } - - public int Update(string tableName, IDictionary data, SimpleExpression criteria, IAdapterTransaction transaction) - { - return Update(tableName, data, criteria); - } - - public int Delete(string tableName, SimpleExpression criteria, IAdapterTransaction transaction) - { - return Delete(tableName, criteria); - } - - public int UpdateMany(string tableName, IEnumerable> dataList, IAdapterTransaction adapterTransaction) - { - return UpdateMany(tableName, dataList); - } - - public int UpdateMany(string tableName, IEnumerable> dataList, IAdapterTransaction adapterTransaction, IList keyFields) - { - return UpdateMany(tableName, dataList, keyFields); - } - - public int UpdateMany(string tableName, IList> dataList, IEnumerable criteriaFieldNames, IAdapterTransaction adapterTransaction) - { - return UpdateMany(tableName, dataList, criteriaFieldNames); - } - - public IEnumerable> RunQuery(SimpleQuery query, IAdapterTransaction transaction, out IEnumerable unhandledClauses) - { - return RunQuery(query, out unhandledClauses); - } - } -} +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using Simple.Data.Operations; + +namespace Simple.Data +{ + public partial class InMemoryAdapter : IAdapterWithTransactions + { + class InMemoryAdapterTransaction : IAdapterTransaction + { + private readonly string _name; + + public InMemoryAdapterTransaction() : this(string.Empty) + { + } + + public InMemoryAdapterTransaction(string name) + { + _name = name; + } + + public void Dispose() + { + } + + public void Commit() + { + } + + public void Rollback() + { + } + + public string Name + { + get { return _name; } + } + } + + public IAdapterTransaction BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.Unspecified) + { + return new InMemoryAdapterTransaction(); + } + + public IAdapterTransaction BeginTransaction(string name, IsolationLevel isolationLevel = IsolationLevel.Unspecified) + { + return new InMemoryAdapterTransaction(name); + } + + public IEnumerable> Find(FindOperation operation, IAdapterTransaction transaction) + { + return Find(operation); + } + + public IEnumerable> Insert(InsertOperation operation, IAdapterTransaction transaction) + { + return Insert(operation); + } + + public int Update(string tableName, IReadOnlyDictionary data, SimpleExpression criteria, IAdapterTransaction transaction) + { + return Update(tableName, data, criteria); + } + + public int Delete(string tableName, SimpleExpression criteria, IAdapterTransaction transaction) + { + return Delete(tableName, criteria); + } + + public int UpdateMany(string tableName, IEnumerable> dataList, IAdapterTransaction adapterTransaction) + { + return UpdateMany(tableName, dataList); + } + + public int UpdateMany(string tableName, IEnumerable> dataList, IAdapterTransaction adapterTransaction, IList keyFields) + { + return UpdateMany(tableName, dataList, keyFields); + } + + public int UpdateMany(string tableName, IList> dataList, IEnumerable criteriaFieldNames, IAdapterTransaction adapterTransaction) + { + return UpdateMany(tableName, dataList, criteriaFieldNames); + } + + public IEnumerable> RunQuery(SimpleQuery query, IAdapterTransaction transaction, out IEnumerable unhandledClauses) + { + return RunQuery(query, out unhandledClauses); + } + + public IEnumerable> Upsert(UpsertOperation operation, + IAdapterTransaction transaction) + { + throw new NotImplementedException(); + } + } +} diff --git a/Simple.Data/MethodNameParser.cs b/Simple.Data/MethodNameParser.cs index 7968bd4b..0d78ad01 100644 --- a/Simple.Data/MethodNameParser.cs +++ b/Simple.Data/MethodNameParser.cs @@ -1,77 +1,77 @@ -using System; -using System.Collections.Generic; -using System.Dynamic; -using System.Linq; -using System.Text; -using Simple.Data.Extensions; - -namespace Simple.Data -{ - internal static class MethodNameParser - { - internal static IDictionary ParseFromBinder(InvokeMemberBinder binder, IList args) - { - if (binder == null) throw new ArgumentNullException("binder"); - if (binder.CallInfo.ArgumentNames != null && binder.CallInfo.ArgumentNames.Count > 0) - { - return ParseFromMethodName(binder.Name, binder.NamedArgumentsToDictionary(args)); - } - if (binder.Name.Equals("findby", StringComparison.OrdinalIgnoreCase) || binder.Name.Equals("find_by", StringComparison.OrdinalIgnoreCase)) - { - if (args.Count == 1) - { - return args[0].ObjectToDictionary(); - } - throw new InvalidOperationException("Invalid criteria specification."); - } - return ParseFromMethodName(binder.Name, args); - } - - internal static IDictionary ParseFromMethodName(string methodName, IList args) - { - if (args == null) throw new ArgumentNullException("args"); - if (args.Count == 0) throw new ArgumentException("No parameters specified."); - - var columns = GetColumns(RemoveCommandPart(methodName)); - - if (columns.Count == 0) throw new ArgumentException("No columns specified."); - - return columns.Select((s,i) => new KeyValuePair(s, args[i])).ToDictionary(); - } - - internal static IEnumerable ParseCriteriaNamesFromMethodName(string methodName) - { - var columns = GetColumns(RemoveCommandPart(methodName)); - - if (columns.Count == 0) throw new ArgumentException("No columns specified."); - - return columns.AsEnumerable(); - } - - internal static IDictionary ParseFromMethodName(string methodName, IDictionary args) - { - if (args == null) throw new ArgumentNullException("args"); - if (args.Count == 0) throw new ArgumentException("No parameters specified."); - - var columns = GetColumns(RemoveCommandPart(methodName)); - - if (columns.Count == 0) throw new ArgumentException("No columns specified."); - - return columns.Select(s => new KeyValuePair(s, args[s])).ToDictionary(); - - } - - internal static string RemoveCommandPart(string methodName) - { - if (methodName == null) throw new ArgumentNullException("methodName"); - if (!methodName.Contains("By")) return methodName; - return methodName.Substring(methodName.IndexOf("By", StringComparison.Ordinal) + 2); - } - - internal static IList GetColumns(string methodName) - { - var columns = methodName.Split(new[] { "And" }, StringSplitOptions.RemoveEmptyEntries); - return columns; - } - } -} +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Text; +using Simple.Data.Extensions; + +namespace Simple.Data +{ + internal static class MethodNameParser + { + internal static IReadOnlyDictionary ParseFromBinder(InvokeMemberBinder binder, IList args) + { + if (binder == null) throw new ArgumentNullException("binder"); + if (binder.CallInfo.ArgumentNames != null && binder.CallInfo.ArgumentNames.Count > 0) + { + return ParseFromMethodName(binder.Name, binder.NamedArgumentsToDictionary(args)); + } + if (binder.Name.Equals("findby", StringComparison.OrdinalIgnoreCase) || binder.Name.Equals("find_by", StringComparison.OrdinalIgnoreCase)) + { + if (args.Count == 1) + { + return args[0].ObjectToDictionary(); + } + throw new InvalidOperationException("Invalid criteria specification."); + } + return ParseFromMethodName(binder.Name, args); + } + + internal static IReadOnlyDictionary ParseFromMethodName(string methodName, IList args) + { + if (args == null) throw new ArgumentNullException("args"); + if (args.Count == 0) throw new ArgumentException("No parameters specified."); + + var columns = GetColumns(RemoveCommandPart(methodName)); + + if (columns.Count == 0) throw new ArgumentException("No columns specified."); + + return columns.Select((s,i) => new KeyValuePair(s, args[i])).ToReadOnlyDictionary(StringComparer.InvariantCultureIgnoreCase); + } + + internal static IEnumerable ParseCriteriaNamesFromMethodName(string methodName) + { + var columns = GetColumns(RemoveCommandPart(methodName)); + + if (columns.Count == 0) throw new ArgumentException("No columns specified."); + + return columns.AsEnumerable(); + } + + internal static IReadOnlyDictionary ParseFromMethodName(string methodName, IReadOnlyDictionary args) + { + if (args == null) throw new ArgumentNullException("args"); + if (args.Count == 0) throw new ArgumentException("No parameters specified."); + + var columns = GetColumns(RemoveCommandPart(methodName)); + + if (columns.Count == 0) throw new ArgumentException("No columns specified."); + + return columns.Select(s => new KeyValuePair(s, args[s])).ToReadOnlyDictionary(StringComparer.InvariantCultureIgnoreCase); + + } + + internal static string RemoveCommandPart(string methodName) + { + if (methodName == null) throw new ArgumentNullException("methodName"); + if (!methodName.Contains("By")) return methodName; + return methodName.Substring(methodName.IndexOf("By", StringComparison.Ordinal) + 2); + } + + internal static IList GetColumns(string methodName) + { + var columns = methodName.Split(new[] { "And" }, StringSplitOptions.RemoveEmptyEntries); + return columns; + } + } +} diff --git a/Simple.Data/Operations/FindOperation.cs b/Simple.Data/Operations/FindOperation.cs new file mode 100644 index 00000000..45edb379 --- /dev/null +++ b/Simple.Data/Operations/FindOperation.cs @@ -0,0 +1,24 @@ +namespace Simple.Data.Operations +{ + public class FindOperation : IOperation + { + private readonly string _tableName; + private readonly SimpleExpression _criteria; + + public FindOperation(string tableName, SimpleExpression criteria) + { + _tableName = tableName; + _criteria = criteria; + } + + public SimpleExpression Criteria + { + get { return _criteria; } + } + + public string TableName + { + get { return _tableName; } + } + } +} \ No newline at end of file diff --git a/Simple.Data/Operations/GetOperation.cs b/Simple.Data/Operations/GetOperation.cs new file mode 100644 index 00000000..56bd249c --- /dev/null +++ b/Simple.Data/Operations/GetOperation.cs @@ -0,0 +1,24 @@ +namespace Simple.Data.Operations +{ + public class GetOperation : IOperation + { + private readonly string _tableName; + private readonly object[] _keyValues; + + public GetOperation(string tableName, object[] keyValues) + { + _tableName = tableName; + _keyValues = keyValues; + } + + public object[] KeyValues + { + get { return _keyValues; } + } + + public string TableName + { + get { return _tableName; } + } + } +} \ No newline at end of file diff --git a/Simple.Data/Operations/InsertOperation.cs b/Simple.Data/Operations/InsertOperation.cs new file mode 100644 index 00000000..b92ea38a --- /dev/null +++ b/Simple.Data/Operations/InsertOperation.cs @@ -0,0 +1,65 @@ +namespace Simple.Data.Operations +{ + using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.Linq; + + public class InsertOperation + { + private readonly IEnumerable> _data; + private readonly bool _resultRequired; + private readonly string _tableName; + private readonly ErrorCallback _errorCallback; + + public InsertOperation(string tableName, IDictionary data, bool resultRequired, ErrorCallback errorCallback = null) + : this(tableName, resultRequired, errorCallback) + { + _data = EnumerableEx.Once(new ReadOnlyDictionary(data)); + } + + public InsertOperation(string tableName, IReadOnlyDictionary data, bool resultRequired, ErrorCallback errorCallback = null) + : this(tableName, resultRequired, errorCallback) + { + _data = EnumerableEx.Once(data); + } + + public InsertOperation(string tableName, IEnumerable> data, bool resultRequired, ErrorCallback errorCallback = null) + : this(tableName, resultRequired, errorCallback) + { + _data = data.Select(d => new ReadOnlyDictionary(d)); + } + + public InsertOperation(string tableName, bool resultRequired, ErrorCallback errorCallback) + { + _tableName = tableName; + _resultRequired = resultRequired; + _errorCallback = errorCallback ?? ((item, exception) => true) ; + } + + public InsertOperation(string tableName, IEnumerable> data, bool resultRequired, ErrorCallback errorCallback = null) + : this(tableName, resultRequired, errorCallback) + { + _data = data; + } + + public bool ResultRequired + { + get { return _resultRequired; } + } + + public string TableName + { + get { return _tableName; } + } + + public IEnumerable> Data + { + get { return _data; } + } + + public ErrorCallback ErrorCallback + { + get { return _errorCallback; } + } + } +} \ No newline at end of file diff --git a/Simple.Data/Operations/Operation.cs b/Simple.Data/Operations/Operation.cs new file mode 100644 index 00000000..4fdd2a99 --- /dev/null +++ b/Simple.Data/Operations/Operation.cs @@ -0,0 +1,7 @@ +namespace Simple.Data.Operations +{ + public interface IOperation + { + + } +} \ No newline at end of file diff --git a/Simple.Data/Operations/UpsertOperation.cs b/Simple.Data/Operations/UpsertOperation.cs new file mode 100644 index 00000000..876fc3f3 --- /dev/null +++ b/Simple.Data/Operations/UpsertOperation.cs @@ -0,0 +1,94 @@ +namespace Simple.Data.Operations +{ + using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.Linq; + + public class UpsertOperation + { + private readonly IEnumerable> _data; + private readonly bool _resultRequired; + private readonly string _tableName; + private readonly string[] _byFieldNames; + private readonly ErrorCallback _errorCallback; + + public UpsertOperation(string tableName, IDictionary data, bool resultRequired, string[] byFieldNames = null, ErrorCallback errorCallback = null) + : this(tableName, resultRequired, byFieldNames, errorCallback) + { + _data = EnumerableEx.Once(new ReadOnlyDictionary(data)); + } + + public UpsertOperation(string tableName, IReadOnlyDictionary data, bool resultRequired, string[] byFieldNames = null, ErrorCallback errorCallback = null) + : this(tableName, resultRequired, byFieldNames, errorCallback) + { + _data = EnumerableEx.Once(data); + } + + public UpsertOperation(string tableName, IEnumerable> data, bool resultRequired, string[] byFieldNames = null, ErrorCallback errorCallback = null) + : this(tableName, resultRequired, byFieldNames, errorCallback) + { + _data = data.Select(d => new ReadOnlyDictionary(d)); + } + + public UpsertOperation(string tableName, bool resultRequired, string[] byFieldNames = null, ErrorCallback errorCallback = null) + { + _tableName = tableName; + _resultRequired = resultRequired; + _byFieldNames = byFieldNames; + _errorCallback = errorCallback ?? ((item, exception) => true) ; + } + + public UpsertOperation(string tableName, IEnumerable> data, bool resultRequired, string[] byFieldNames = null, ErrorCallback errorCallback = null) + : this(tableName, resultRequired, byFieldNames, errorCallback) + { + _data = data; + } + + public bool ResultRequired + { + get { return _resultRequired; } + } + + public string TableName + { + get { return _tableName; } + } + + public IEnumerable> Data + { + get { return _data; } + } + + public ErrorCallback ErrorCallback + { + get { return _errorCallback; } + } + + public string[] ByFieldNames + { + get { return _byFieldNames; } + } + } + + public class UpdateOperation + { + private readonly string _tableName; + private readonly IReadOnlyDictionary _data; + + public UpdateOperation(string tableName, IReadOnlyDictionary data) + { + _tableName = tableName; + _data = data; + } + + public string TableName + { + get { return _tableName; } + } + + public IReadOnlyDictionary Data + { + get { return _data; } + } + } +} \ No newline at end of file diff --git a/Simple.Data/OptimizingDelegateFactory.cs b/Simple.Data/OptimizingDelegateFactory.cs index 1d7ac897..472a7e59 100644 --- a/Simple.Data/OptimizingDelegateFactory.cs +++ b/Simple.Data/OptimizingDelegateFactory.cs @@ -1,24 +1,25 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Simple.Data -{ - public abstract class OptimizingDelegateFactory - { - public virtual Func> CreateFindOneDelegate(Adapter adapter, string tableName, SimpleExpression criteria) - { - return adapter.CreateFindOneDelegate(tableName, criteria); - } - - public virtual Func> CreateGetDelegate(Adapter adapter, string tableName, object[] keyValues) - { - return args => adapter.Get(tableName, args); - } - } - - internal class DefaultOptimizingDelegateFactory : OptimizingDelegateFactory - { - - } +using System; +using System.Collections.Generic; +using System.Linq; +using Simple.Data.Operations; + +namespace Simple.Data +{ + public abstract class OptimizingDelegateFactory + { + public virtual Func> CreateFindOneDelegate(Adapter adapter, string tableName, SimpleExpression criteria) + { + return adapter.CreateFindOneDelegate(tableName, criteria); + } + + public virtual Func> CreateGetDelegate(Adapter adapter, GetOperation operation) + { + return args => adapter.Get(operation); + } + } + + internal class DefaultOptimizingDelegateFactory : OptimizingDelegateFactory + { + + } } \ No newline at end of file diff --git a/Simple.Data/PropertySetterBuilder.cs b/Simple.Data/PropertySetterBuilder.cs index 2282f393..677b9657 100644 --- a/Simple.Data/PropertySetterBuilder.cs +++ b/Simple.Data/PropertySetterBuilder.cs @@ -1,391 +1,372 @@ -namespace Simple.Data -{ - using System; - using System.Collections; - using System.Collections.Generic; - using System.Linq; - using System.Linq.Expressions; - using System.Reflection; - - class PropertySetterBuilder - { - private static readonly MethodInfo DictionaryContainsKeyMethod = typeof(IDictionary).GetMethod("ContainsKey", new[] { typeof(string) }); - private static readonly PropertyInfo DictionaryIndexerProperty = typeof(IDictionary).GetProperty("Item"); - - private static readonly MethodInfo ToArrayDictionaryMethod = typeof(Enumerable).GetMethod("ToArray", - BindingFlags.Public | - BindingFlags.Static).MakeGenericMethod(typeof(IDictionary)); - - private static readonly MethodInfo ToArrayObjectMethod = typeof(Enumerable).GetMethod("ToArray", - BindingFlags.Public | - BindingFlags.Static).MakeGenericMethod(typeof(object)); - - - private static readonly PropertyInfo ArrayDictionaryLengthProperty = - typeof(IDictionary[]).GetProperty("Length"); - - private static readonly PropertyInfo ArrayObjectLengthProperty = - typeof(object[]).GetProperty("Length"); - - private readonly ParameterExpression _param; - private readonly ParameterExpression _obj; - private readonly PropertyInfo _property; - private MemberExpression _nameProperty; - private IndexExpression _itemProperty; - private MethodCallExpression _containsKey; - private static readonly MethodInfo CreatorCreateMethod = typeof(ConcreteTypeCreator).GetMethod("Create"); - - public PropertySetterBuilder(ParameterExpression param, ParameterExpression obj, PropertyInfo property) - { - _param = param; - _obj = obj; - _property = property; - } - - public ConditionalExpression CreatePropertySetter() - { - CreatePropertyExpressions(); - - if (PropertyIsPrimitive()) - { - return Expression.IfThen(_containsKey, CreateTrySimpleAssign()); - } - - if (_property.PropertyType.IsArray) - { - return Expression.IfThen(_containsKey, CreateTrySimpleArrayAssign()); - } - - if (_property.PropertyType.IsGenericCollection()) - { - var collectionCreator = BuildCollectionCreator(); - if (collectionCreator != null) - { - return Expression.IfThen(_containsKey, collectionCreator); - } - } - - var isDictionary = Expression.TypeIs(_itemProperty, typeof(IDictionary)); - - var tryComplexAssign = Expression.TryCatch(CreateComplexAssign(), - CreateCatchBlock()); - - var ifThen = Expression.IfThen(_containsKey, // if (dict.ContainsKey(propertyName)) { - Expression.IfThenElse(isDictionary, tryComplexAssign, CreateTrySimpleAssign())); - - return ifThen; - } - - private Expression BuildArrayCreator() - { - if (!_property.CanWrite) return null; - - var genericType = _property.PropertyType.GetGenericArguments().Single(); - var creatorInstance = ConcreteTypeCreator.Get(genericType); - var collection = Expression.Variable(_property.PropertyType); - - var createCollection = MakeCreateNewCollection(collection, genericType); - - if (createCollection == null) return null; - - var addMethod = _property.PropertyType.GetMethod("Add"); - - if (addMethod == null) return null; - - return BuildCollectionCreatorExpression(genericType, creatorInstance, collection, createCollection, addMethod); - } - - private Expression BuildCollectionCreator() - { - var genericType = _property.PropertyType.GetGenericArguments().Single(); - var creatorInstance = ConcreteTypeCreator.Get(genericType); - var collection = Expression.Variable(_property.PropertyType); - BinaryExpression createCollection = null; - if (_property.CanWrite) - { - createCollection = MakeCreateNewCollection(collection, genericType); - } - else - { - createCollection = Expression.Assign(collection, _nameProperty); - } - - var addMethod = _property.PropertyType.GetInterfaceMethod("Add"); - - if (createCollection != null && addMethod != null) - { - return BuildCollectionCreatorExpression(genericType, creatorInstance, collection, createCollection, addMethod); - } - return null; - } - - private Expression BuildCollectionCreatorExpression(Type genericType, ConcreteTypeCreator creatorInstance, ParameterExpression collection, BinaryExpression createCollection, MethodInfo addMethod) - { - BlockExpression dictionaryBlock; - var isDictionaryCollection = BuildComplexTypeCollectionPopulator(collection, genericType, addMethod, createCollection, creatorInstance, out dictionaryBlock); - - BlockExpression objectBlock; - var isObjectcollection = BuildSimpleTypeCollectionPopulator(collection, genericType, addMethod, createCollection, creatorInstance, out objectBlock); - - return Expression.IfThenElse(isDictionaryCollection, dictionaryBlock, - Expression.IfThen(isObjectcollection, objectBlock)); - } - - private TypeBinaryExpression BuildComplexTypeCollectionPopulator(ParameterExpression collection, Type genericType, - MethodInfo addMethod, BinaryExpression createCollection, - ConcreteTypeCreator creatorInstance, out BlockExpression block) - { - var creator = Expression.Constant(creatorInstance); - var array = Expression.Variable(typeof (IDictionary[])); - var i = Expression.Variable(typeof (int)); - var current = Expression.Variable(typeof (IDictionary)); - - var isDictionaryCollection = Expression.TypeIs(_itemProperty, - typeof (IEnumerable>)); - - var toArray = Expression.Assign(array, - Expression.Call(ToArrayDictionaryMethod, - Expression.Convert(_itemProperty, - typeof (IEnumerable>)))); - var start = Expression.Assign(i, Expression.Constant(0)); - var label = Expression.Label(); - var loop = Expression.Loop( - Expression.IfThenElse( - Expression.LessThan(i, Expression.Property(array, ArrayDictionaryLengthProperty)), - Expression.Block( - Expression.Assign(current, Expression.ArrayIndex(array, i)), - Expression.Call(collection, addMethod, - Expression.Convert(Expression.Call(creator, CreatorCreateMethod, current), genericType)), - Expression.PreIncrementAssign(i) - ), - Expression.Break(label) - ), - label - ); - - block = Expression.Block( - new[] {array, i, collection, current}, - createCollection, - toArray, - start, - loop, - _property.CanWrite ? (Expression) Expression.Assign(_nameProperty, collection) : Expression.Empty()); - - return isDictionaryCollection; - } - - private TypeBinaryExpression BuildSimpleTypeCollectionPopulator(ParameterExpression collection, Type genericType, - MethodInfo addMethod, BinaryExpression createCollection, - ConcreteTypeCreator creatorInstance, out BlockExpression block) - { - var creator = Expression.Constant(creatorInstance); - var array = Expression.Variable(typeof(object[])); - var i = Expression.Variable(typeof(int)); - var current = Expression.Variable(typeof(object)); - - var isObjectCollection = Expression.TypeIs(_itemProperty, - typeof(IEnumerable)); - - var toArray = Expression.Assign(array, - Expression.Call(ToArrayObjectMethod, - Expression.Convert(_itemProperty, - typeof(IEnumerable)))); - var start = Expression.Assign(i, Expression.Constant(0)); - var label = Expression.Label(); - var loop = Expression.Loop( - Expression.IfThenElse( - Expression.LessThan(i, Expression.Property(array, ArrayObjectLengthProperty)), - Expression.Block( - Expression.Assign(current, Expression.ArrayIndex(array, i)), - Expression.IfThenElse( - Expression.TypeIs(current, typeof(IDictionary)), - Expression.Call(collection, addMethod, - Expression.Convert(Expression.Call(creator, CreatorCreateMethod, - Expression.Convert(current, typeof(IDictionary))), - genericType)), - Expression.Call(collection, addMethod, - Expression.Convert(current, genericType))), - Expression.PreIncrementAssign(i) - ), - Expression.Break(label) - ), - label - ); - - block = Expression.Block( - new[] { array, i, collection, current }, - createCollection, - toArray, - start, - loop, - _property.CanWrite ? (Expression)Expression.Assign(_nameProperty, collection) : Expression.Empty()); - - return isObjectCollection; - } - - private BinaryExpression MakeCreateNewCollection(ParameterExpression collection, Type genericType) - { - BinaryExpression createCollection; - - if (_property.PropertyType.IsInterface) - { - createCollection = Expression.Assign(collection, - Expression.Call( - typeof (PropertySetterBuilder).GetMethod("CreateList", - BindingFlags. - NonPublic | - BindingFlags. - Static). - MakeGenericMethod(genericType))); - } - else - { - var defaultConstructor = _property.PropertyType.GetConstructor(Type.EmptyTypes); - if (defaultConstructor != null) - { - createCollection = Expression.Assign(collection, Expression.New(defaultConstructor)); - } - else - { - createCollection = null; - } - } - return createCollection; - } - - private bool PropertyIsPrimitive() - { - return _property.PropertyType.IsPrimitive || _property.PropertyType == typeof(string) || - _property.PropertyType == typeof(DateTime) || _property.PropertyType == typeof(byte[]) || - _property.PropertyType.IsEnum || - (_property.PropertyType.IsGenericType && _property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>)); - } - - private void CreatePropertyExpressions() - { - var name = Expression.Constant(_property.Name, typeof(string)); - _containsKey = Expression.Call(_param, DictionaryContainsKeyMethod, name); - _nameProperty = Expression.Property(_obj, _property); - _itemProperty = Expression.Property(_param, DictionaryIndexerProperty, name); - } - - private CatchBlock CreateCatchBlock() - { - return Expression.Catch(typeof(Exception), Expression.Assign(_nameProperty, - Expression.Default(_property.PropertyType))); - } - - private BinaryExpression CreateComplexAssign() - { - var creator = Expression.Constant(ConcreteTypeCreator.Get(_property.PropertyType)); - var methodCallExpression = Expression.Call(creator, CreatorCreateMethod, -// ReSharper disable PossiblyMistakenUseOfParamsMethod - Expression.Convert(_itemProperty, - typeof(IDictionary))); -// ReSharper restore PossiblyMistakenUseOfParamsMethod - - var complexAssign = Expression.Assign(_nameProperty, - Expression.Convert( - methodCallExpression, _property.PropertyType)); - return complexAssign; - } - - private TryExpression CreateTrySimpleAssign() - { - MethodCallExpression callConvert; - if (_property.PropertyType.IsEnum) - { - var changeTypeMethod = typeof (PropertySetterBuilder).GetMethod("SafeConvert", - BindingFlags.Static | BindingFlags.NonPublic); - callConvert = Expression.Call(changeTypeMethod, _itemProperty, - Expression.Constant(_property.PropertyType.GetEnumUnderlyingType(), typeof(Type))); - } - else if (_property.PropertyType.IsGenericType && _property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) - { - var changeTypeMethod = typeof (PropertySetterBuilder) - .GetMethod("SafeConvertNullable", BindingFlags.Static | BindingFlags.NonPublic) - .MakeGenericMethod(_property.PropertyType.GetGenericArguments().Single()); - - callConvert = Expression.Call(changeTypeMethod, _itemProperty); - } - else - { - var changeTypeMethod = typeof (PropertySetterBuilder).GetMethod("SafeConvert", - BindingFlags.Static | BindingFlags.NonPublic); - callConvert = Expression.Call(changeTypeMethod, _itemProperty, - Expression.Constant(_property.PropertyType, typeof(Type))); - } - - var assign = Expression.Assign(_nameProperty, Expression.Convert(callConvert, _property.PropertyType)); - if (_property.PropertyType.IsEnum) - { - return Expression.TryCatch( // try { - Expression.IfThenElse(Expression.TypeIs(_itemProperty, typeof (string)), - Expression.Assign(_nameProperty, - Expression.Convert(Expression.Call(typeof (Enum).GetMethod("Parse", new[] {typeof(Type), typeof(string), typeof(bool)}), - Expression.Constant(_property.PropertyType, typeof(Type)), - Expression.Call(_itemProperty, typeof(object).GetMethod("ToString")), Expression.Constant(true)), _property.PropertyType)), - assign), Expression.Catch(typeof(Exception), Expression.Empty())); - } - return Expression.TryCatch( // try { - assign, - CreateCatchBlock()); - } - - private TryExpression CreateTrySimpleArrayAssign() - { - var createArrayMethod = typeof (PropertySetterBuilder).GetMethod("CreateArray", BindingFlags.Static | BindingFlags.NonPublic) - .MakeGenericMethod(_property.PropertyType.GetElementType()); - - var callConvert = Expression.Call(createArrayMethod, _itemProperty); - - var assign = Expression.Assign(_nameProperty, Expression.Convert(callConvert, _property.PropertyType)); - return Expression.TryCatch( // try { - Expression.IfThenElse(Expression.TypeIs(_itemProperty, typeof (string)), - Expression.Assign(_nameProperty, - Expression.Convert(Expression.Call(typeof (Enum).GetMethod("Parse", new[] {typeof(Type), typeof(string), typeof(bool)}), - Expression.Constant(_property.PropertyType, typeof(Type)), - Expression.Call(_itemProperty, typeof(object).GetMethod("ToString")), Expression.Constant(true)), _property.PropertyType)), - assign), Expression.Catch(typeof(Exception), Expression.Empty())); - } - - - -// ReSharper disable UnusedMember.Local -// Because they're used from runtime-generated code, you see. - internal static object SafeConvert(object source, Type targetType) - { - if (ReferenceEquals(source, null)) return null; - if (targetType.IsInstanceOfType(source)) return source; - return Convert.ChangeType(source, targetType); - } - - internal static T? SafeConvertNullable(object source) - where T : struct - { - if (ReferenceEquals(source, null)) return default(T?); - return (T) source; - } - - private static T[] CreateArray(object source) - { - if (ReferenceEquals(source, null)) return null; - var enumerable = source as IEnumerable; - if (ReferenceEquals(enumerable, null)) return null; - try - { - return enumerable.Cast().ToArray(); - } - catch (InvalidCastException) - { - return null; - } - } - - private static List CreateList() - { - return new List(); - } -// ReSharper restore UnusedMember.Local - } +namespace Simple.Data +{ + using System; + using System.Collections; + using System.Collections.Generic; + using System.Linq; + using System.Linq.Expressions; + using System.Reflection; + + class PropertySetterBuilder + { + private static readonly MethodInfo DictionaryContainsKeyMethod = typeof(IDictionary).GetMethod("ContainsKey", new[] { typeof(string) }); + private static readonly PropertyInfo DictionaryIndexerProperty = typeof(IDictionary).GetProperty("Item"); + + private static readonly MethodInfo ToArrayDictionaryMethod = typeof(Enumerable).GetMethod("ToArray", + BindingFlags.Public | + BindingFlags.Static).MakeGenericMethod(typeof(IDictionary)); + + private static readonly MethodInfo ToArrayObjectMethod = typeof(Enumerable).GetMethod("ToArray", + BindingFlags.Public | + BindingFlags.Static).MakeGenericMethod(typeof(object)); + + + private static readonly PropertyInfo ArrayDictionaryLengthProperty = + typeof(IDictionary[]).GetProperty("Length"); + + private static readonly PropertyInfo ArrayObjectLengthProperty = + typeof(object[]).GetProperty("Length"); + + private readonly ParameterExpression _param; + private readonly ParameterExpression _obj; + private readonly PropertyInfo _property; + private MemberExpression _nameProperty; + private IndexExpression _itemProperty; + private MethodCallExpression _containsKey; + private static readonly MethodInfo CreatorCreateMethod = typeof(ConcreteTypeCreator).GetMethod("Create"); + + public PropertySetterBuilder(ParameterExpression param, ParameterExpression obj, PropertyInfo property) + { + _param = param; + _obj = obj; + _property = property; + } + + public ConditionalExpression CreatePropertySetter() + { + CreatePropertyExpressions(); + + if (PropertyIsPrimitive()) + { + return Expression.IfThen(_containsKey, CreateTrySimpleAssign()); + } + + if (_property.PropertyType.IsArray) + { + return Expression.IfThen(_containsKey, CreateTrySimpleArrayAssign()); + } + + if (_property.PropertyType.IsGenericCollection()) + { + var collectionCreator = BuildCollectionCreator(); + if (collectionCreator != null) + { + return Expression.IfThen(_containsKey, collectionCreator); + } + } + + var isDictionary = Expression.TypeIs(_itemProperty, typeof(IDictionary)); + + var tryComplexAssign = Expression.TryCatch(CreateComplexAssign(), + CreateCatchBlock()); + + var ifThen = Expression.IfThen(_containsKey, // if (dict.ContainsKey(propertyName)) { + Expression.IfThenElse(isDictionary, tryComplexAssign, CreateTrySimpleAssign())); + + return ifThen; + } + + private Expression BuildCollectionCreator() + { + var genericType = _property.PropertyType.GetGenericArguments().Single(); + var creatorInstance = ConcreteTypeCreator.Get(genericType); + var collection = Expression.Variable(_property.PropertyType); + BinaryExpression createCollection = null; + if (_property.CanWrite) + { + createCollection = MakeCreateNewCollection(collection, genericType); + } + else + { + createCollection = Expression.Assign(collection, _nameProperty); + } + + var addMethod = _property.PropertyType.GetInterfaceMethod("Add"); + + if (createCollection != null && addMethod != null) + { + return BuildCollectionCreatorExpression(genericType, creatorInstance, collection, createCollection, addMethod); + } + return null; + } + + private Expression BuildCollectionCreatorExpression(Type genericType, ConcreteTypeCreator creatorInstance, ParameterExpression collection, BinaryExpression createCollection, MethodInfo addMethod) + { + BlockExpression dictionaryBlock; + var isDictionaryCollection = BuildComplexTypeCollectionPopulator(collection, genericType, addMethod, createCollection, creatorInstance, out dictionaryBlock); + + BlockExpression objectBlock; + var isObjectcollection = BuildSimpleTypeCollectionPopulator(collection, genericType, addMethod, createCollection, creatorInstance, out objectBlock); + + return Expression.IfThenElse(isDictionaryCollection, dictionaryBlock, + Expression.IfThen(isObjectcollection, objectBlock)); + } + + private TypeBinaryExpression BuildComplexTypeCollectionPopulator(ParameterExpression collection, Type genericType, + MethodInfo addMethod, BinaryExpression createCollection, + ConcreteTypeCreator creatorInstance, out BlockExpression block) + { + var creator = Expression.Constant(creatorInstance); + var array = Expression.Variable(typeof (IDictionary[])); + var i = Expression.Variable(typeof (int)); + var current = Expression.Variable(typeof (IDictionary)); + + var isDictionaryCollection = Expression.TypeIs(_itemProperty, + typeof (IEnumerable>)); + + var toArray = Expression.Assign(array, + Expression.Call(ToArrayDictionaryMethod, + Expression.Convert(_itemProperty, + typeof (IEnumerable>)))); + var start = Expression.Assign(i, Expression.Constant(0)); + var label = Expression.Label(); + var loop = Expression.Loop( + Expression.IfThenElse( + Expression.LessThan(i, Expression.Property(array, ArrayDictionaryLengthProperty)), + Expression.Block( + Expression.Assign(current, Expression.ArrayIndex(array, i)), + Expression.Call(collection, addMethod, + Expression.Convert(Expression.Call(creator, CreatorCreateMethod, current), genericType)), + Expression.PreIncrementAssign(i) + ), + Expression.Break(label) + ), + label + ); + + block = Expression.Block( + new[] {array, i, collection, current}, + createCollection, + toArray, + start, + loop, + _property.CanWrite ? (Expression) Expression.Assign(_nameProperty, collection) : Expression.Empty()); + + return isDictionaryCollection; + } + + private TypeBinaryExpression BuildSimpleTypeCollectionPopulator(ParameterExpression collection, Type genericType, + MethodInfo addMethod, BinaryExpression createCollection, + ConcreteTypeCreator creatorInstance, out BlockExpression block) + { + var creator = Expression.Constant(creatorInstance); + var array = Expression.Variable(typeof(object[])); + var i = Expression.Variable(typeof(int)); + var current = Expression.Variable(typeof(object)); + + var isObjectCollection = Expression.TypeIs(_itemProperty, + typeof(IEnumerable)); + + var toArray = Expression.Assign(array, + Expression.Call(ToArrayObjectMethod, + Expression.Convert(_itemProperty, + typeof(IEnumerable)))); + var start = Expression.Assign(i, Expression.Constant(0)); + var label = Expression.Label(); + var loop = Expression.Loop( + Expression.IfThenElse( + Expression.LessThan(i, Expression.Property(array, ArrayObjectLengthProperty)), + Expression.Block( + Expression.Assign(current, Expression.ArrayIndex(array, i)), + Expression.IfThenElse( + Expression.TypeIs(current, typeof(IDictionary)), + Expression.Call(collection, addMethod, + Expression.Convert(Expression.Call(creator, CreatorCreateMethod, + Expression.Convert(current, typeof(IDictionary))), + genericType)), + Expression.Call(collection, addMethod, + Expression.Convert(current, genericType))), + Expression.PreIncrementAssign(i) + ), + Expression.Break(label) + ), + label + ); + + block = Expression.Block( + new[] { array, i, collection, current }, + createCollection, + toArray, + start, + loop, + _property.CanWrite ? (Expression)Expression.Assign(_nameProperty, collection) : Expression.Empty()); + + return isObjectCollection; + } + + private BinaryExpression MakeCreateNewCollection(ParameterExpression collection, Type genericType) + { + BinaryExpression createCollection; + + if (_property.PropertyType.IsInterface) + { + createCollection = Expression.Assign(collection, + Expression.Call( + typeof (PropertySetterBuilder).GetMethod("CreateList", + BindingFlags. + NonPublic | + BindingFlags. + Static). + MakeGenericMethod(genericType))); + } + else + { + var defaultConstructor = _property.PropertyType.GetConstructor(Type.EmptyTypes); + if (defaultConstructor != null) + { + createCollection = Expression.Assign(collection, Expression.New(defaultConstructor)); + } + else + { + createCollection = null; + } + } + return createCollection; + } + + private bool PropertyIsPrimitive() + { + return _property.PropertyType.IsPrimitive || _property.PropertyType == typeof(string) || + _property.PropertyType == typeof(DateTime) || _property.PropertyType == typeof(byte[]) || + _property.PropertyType.IsEnum || + (_property.PropertyType.IsGenericType && _property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>)); + } + + private void CreatePropertyExpressions() + { + var name = Expression.Constant(_property.Name, typeof(string)); + _containsKey = Expression.Call(_param, DictionaryContainsKeyMethod, name); + _nameProperty = Expression.Property(_obj, _property); + _itemProperty = Expression.Property(_param, DictionaryIndexerProperty, name); + } + + private CatchBlock CreateCatchBlock() + { + return Expression.Catch(typeof(Exception), Expression.Assign(_nameProperty, + Expression.Default(_property.PropertyType))); + } + + private BinaryExpression CreateComplexAssign() + { + var creator = Expression.Constant(ConcreteTypeCreator.Get(_property.PropertyType)); + var methodCallExpression = Expression.Call(creator, CreatorCreateMethod, +// ReSharper disable PossiblyMistakenUseOfParamsMethod + Expression.Convert(_itemProperty, + typeof(IDictionary))); +// ReSharper restore PossiblyMistakenUseOfParamsMethod + + var complexAssign = Expression.Assign(_nameProperty, + Expression.Convert( + methodCallExpression, _property.PropertyType)); + return complexAssign; + } + + private TryExpression CreateTrySimpleAssign() + { + MethodCallExpression callConvert; + if (_property.PropertyType.IsEnum) + { + var changeTypeMethod = typeof (PropertySetterBuilder).GetMethod("SafeConvert", + BindingFlags.Static | BindingFlags.NonPublic); + callConvert = Expression.Call(changeTypeMethod, _itemProperty, + Expression.Constant(_property.PropertyType.GetEnumUnderlyingType(), typeof(Type))); + } + else if (_property.PropertyType.IsGenericType && _property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + var changeTypeMethod = typeof (PropertySetterBuilder) + .GetMethod("SafeConvertNullable", BindingFlags.Static | BindingFlags.NonPublic) + .MakeGenericMethod(_property.PropertyType.GetGenericArguments().Single()); + + callConvert = Expression.Call(changeTypeMethod, _itemProperty); + } + else + { + var changeTypeMethod = typeof (PropertySetterBuilder).GetMethod("SafeConvert", + BindingFlags.Static | BindingFlags.NonPublic); + callConvert = Expression.Call(changeTypeMethod, _itemProperty, + Expression.Constant(_property.PropertyType, typeof(Type))); + } + + var assign = Expression.Assign(_nameProperty, Expression.Convert(callConvert, _property.PropertyType)); + if (_property.PropertyType.IsEnum) + { + return Expression.TryCatch( // try { + Expression.IfThenElse(Expression.TypeIs(_itemProperty, typeof (string)), + Expression.Assign(_nameProperty, + Expression.Convert(Expression.Call(typeof (Enum).GetMethod("Parse", new[] {typeof(Type), typeof(string), typeof(bool)}), + Expression.Constant(_property.PropertyType, typeof(Type)), + Expression.Call(_itemProperty, typeof(object).GetMethod("ToString")), Expression.Constant(true)), _property.PropertyType)), + assign), Expression.Catch(typeof(Exception), Expression.Empty())); + } + return Expression.TryCatch( // try { + assign, + CreateCatchBlock()); + } + + private TryExpression CreateTrySimpleArrayAssign() + { + var createArrayMethod = typeof (PropertySetterBuilder).GetMethod("CreateArray", BindingFlags.Static | BindingFlags.NonPublic) + .MakeGenericMethod(_property.PropertyType.GetElementType()); + + var callConvert = Expression.Call(createArrayMethod, _itemProperty); + + var assign = Expression.Assign(_nameProperty, Expression.Convert(callConvert, _property.PropertyType)); + return Expression.TryCatch( // try { + Expression.IfThenElse(Expression.TypeIs(_itemProperty, typeof (string)), + Expression.Assign(_nameProperty, + Expression.Convert(Expression.Call(typeof (Enum).GetMethod("Parse", new[] {typeof(Type), typeof(string), typeof(bool)}), + Expression.Constant(_property.PropertyType, typeof(Type)), + Expression.Call(_itemProperty, typeof(object).GetMethod("ToString")), Expression.Constant(true)), _property.PropertyType)), + assign), Expression.Catch(typeof(Exception), Expression.Empty())); + } + + + +// ReSharper disable UnusedMember.Local +// Because they're used from runtime-generated code, you see. + internal static object SafeConvert(object source, Type targetType) + { + if (ReferenceEquals(source, null)) return null; + if (targetType.IsInstanceOfType(source)) return source; + return Convert.ChangeType(source, targetType); + } + + internal static T? SafeConvertNullable(object source) + where T : struct + { + if (ReferenceEquals(source, null)) return default(T?); + return (T) source; + } + + private static T[] CreateArray(object source) + { + if (ReferenceEquals(source, null)) return null; + var enumerable = source as IEnumerable; + if (ReferenceEquals(enumerable, null)) return null; + try + { + return enumerable.Cast().ToArray(); + } + catch (InvalidCastException) + { + return null; + } + } + + private static List CreateList() + { + return new List(); + } +// ReSharper restore UnusedMember.Local + } } \ No newline at end of file diff --git a/Simple.Data/QueryPolyfills/WhereClauseHandler.cs b/Simple.Data/QueryPolyfills/WhereClauseHandler.cs index 43bee4a8..0d8acdd0 100644 --- a/Simple.Data/QueryPolyfills/WhereClauseHandler.cs +++ b/Simple.Data/QueryPolyfills/WhereClauseHandler.cs @@ -1,213 +1,214 @@ -namespace Simple.Data.QueryPolyfills -{ - using System; - using System.Collections; - using System.Collections.Generic; - using System.Linq; - using System.Text.RegularExpressions; - using Extensions; - - internal class WhereClauseHandler - { - private readonly Dictionary, bool>>> _expressionFormatters; - - private readonly string _mainTableName; - private readonly WhereClause _whereClause; - - public WhereClauseHandler(string mainTableName, WhereClause whereClause) - { - _mainTableName = mainTableName; - _whereClause = whereClause; - _expressionFormatters = new Dictionary, bool>>> - { - {SimpleExpressionType.And, LogicalExpressionToWhereClause}, - {SimpleExpressionType.Or, LogicalExpressionToWhereClause}, - {SimpleExpressionType.Equal, EqualExpressionToWhereClause}, - {SimpleExpressionType.NotEqual, NotEqualExpressionToWhereClause}, - {SimpleExpressionType.Function, FunctionExpressionToWhereClause}, - {SimpleExpressionType.GreaterThan, GreaterThanToWhereClause}, - {SimpleExpressionType.LessThan, LessThanToWhereClause}, - {SimpleExpressionType.GreaterThanOrEqual, GreaterThanOrEqualToWhereClause}, - {SimpleExpressionType.LessThanOrEqual, LessThanOrEqualToWhereClause}, - {SimpleExpressionType.Empty, expr => _ => true }, - }; - } - - private Func, bool> FunctionExpressionToWhereClause(SimpleExpression arg) - { - var function = arg.RightOperand as SimpleFunction; - if (ReferenceEquals(function, null)) throw new InvalidOperationException("Expression type of function but no function supplied."); - if (function.Name.Equals("like", StringComparison.OrdinalIgnoreCase) || - function.Name.Equals("notlike", StringComparison.OrdinalIgnoreCase)) - { - var pattern = function.Args[0].ToString(); - if (pattern.Contains("%") || pattern.Contains("_")) // SQL Server LIKE - { - pattern = pattern.Replace("%", ".*").Replace('_', '.'); - } - - var regex = new Regex("^" + pattern + "$", RegexOptions.Multiline | RegexOptions.IgnoreCase); - - if (function.Name.Equals("like", StringComparison.OrdinalIgnoreCase)) - { - return d => Resolve(d, arg.LeftOperand).Count > 0 && Resolve(d, arg.LeftOperand).OfType().Any(regex.IsMatch); - } - if (function.Name.Equals("notlike", StringComparison.OrdinalIgnoreCase)) - { - return d => Resolve(d, arg.LeftOperand).Count > 0 && Resolve(d, arg.LeftOperand).OfType().All(input => !regex.IsMatch(input)); - } - } - - throw new NotSupportedException("Expression Function not supported."); - } - - private Func, bool> GreaterThanToWhereClause(SimpleExpression arg) - { - return d => Resolve(d, arg.LeftOperand).OfType().Any(o => o.CompareTo(arg.RightOperand) > 0); - } - - private Func, bool> LessThanToWhereClause(SimpleExpression arg) - { - return d => Resolve(d, arg.LeftOperand).OfType().Any(o => o.CompareTo(arg.RightOperand) < 0); - } - - private Func, bool> GreaterThanOrEqualToWhereClause(SimpleExpression arg) - { - return d => Resolve(d, arg.LeftOperand).OfType().Any(o => o.CompareTo(arg.RightOperand) >= 0); - } - - private Func, bool> LessThanOrEqualToWhereClause(SimpleExpression arg) - { - return d => Resolve(d, arg.LeftOperand).OfType().Any(o => o.CompareTo(arg.RightOperand) <= 0); - } - - private Func, bool> NotEqualExpressionToWhereClause(SimpleExpression arg) - { - var equal = EqualExpressionToWhereClause(arg); - return d => !equal(d); - } - - private Func, bool> EqualExpressionToWhereClause(SimpleExpression arg) - { - if (ReferenceEquals(arg.RightOperand, null)) - { - return d => Resolve(d, arg.LeftOperand).Count == 0 || Resolve(d, arg.LeftOperand).Any(o => ReferenceEquals(o, null)); - } - - if (arg.RightOperand.GetType().IsArray) - { - return - d => - { - var resolvedLeftOperand = Resolve(d, arg.LeftOperand); - if (resolvedLeftOperand.OfType().Any()) - { - return resolvedLeftOperand.OfType().Any( - o => o.Cast().SequenceEqual(((IEnumerable)arg.RightOperand).Cast())); - } - return resolvedLeftOperand.Any( - o => ((IEnumerable)arg.RightOperand).Cast().Contains(o)); - }; - } - - return d => Resolve(d, arg.LeftOperand).Contains(arg.RightOperand); - } - - private Func, bool> Format(SimpleExpression expression) - { - Func, bool>> formatter; - - if (_expressionFormatters.TryGetValue(expression.Type, out formatter)) - { - return formatter(expression); - } - - return _ => true; - } - - private Func, bool> LogicalExpressionToWhereClause(SimpleExpression arg) - { - var left = Format((SimpleExpression)arg.LeftOperand); - var right = Format((SimpleExpression)arg.RightOperand); - - if (arg.Type == SimpleExpressionType.Or) - { - return d => (left(d) || right(d)); - } - return d => (left(d) && right(d)); - } - - private IList Resolve(IDictionary dict, object operand, string key = null) - { - var objectReference = operand as ObjectReference; - if (objectReference.IsNull()) return new object[0]; - - key = key ?? objectReference.GetAliasOrName(); - var keys = objectReference.GetAllObjectNames(); - - if (keys.Length > 2) - { - if (_mainTableName.Contains(".")) - { - keys = keys.Skip(1).ToArray(); - keys[0] = _mainTableName; - } - } - if (keys.Length > 2) - { - return ResolveSubs(dict, objectReference.GetOwner(), key).ToList(); - } - - if (keys.Length == 2 && !HomogenizedEqualityComparer.DefaultInstance.Equals(keys[0].Singularize(), _mainTableName.Singularize())) - { - var joinedDict = dict[keys[0]] as IDictionary; - if (joinedDict != null && joinedDict.ContainsKey(keys[1])) - { - return new[] { joinedDict[keys[1]] }; - } - - var joinedDicts = dict[keys[0]] as IEnumerable>; - if (joinedDicts != null) - { - return joinedDicts.Select(d => d.ContainsKey(keys[1]) ? d[keys[1]] : null).ToArray(); - } - } - - if (dict.ContainsKey(key)) - return new[] { dict[key] }; - - return new object[0]; - } - - private IEnumerable ResolveSubs(IDictionary dict, ObjectReference objectReference, string key) - { - if (objectReference.IsNull()) return Enumerable.Empty(); - - if (dict.ContainsKey(objectReference.GetName())) - { - var master = dict[objectReference.GetName()] as IDictionary; - if (master != null) - { - if (master.ContainsKey(key)) - { - return new[] { master[key] }; - } - } - - var detail = dict[objectReference.GetName()] as IEnumerable>; - if (detail != null) - { - return detail.SelectMany(d => Resolve(d, objectReference, key)); - } - } - - return ResolveSubs(dict, objectReference.GetOwner(), key); - } - - public IEnumerable> Run(IEnumerable> source) - { - var predicate = Format(_whereClause.Criteria); - return source.Where(predicate); - } - } +namespace Simple.Data.QueryPolyfills +{ + using System; + using System.Collections; + using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.Linq; + using System.Text.RegularExpressions; + using Extensions; + + internal class WhereClauseHandler + { + private readonly Dictionary, bool>>> _expressionFormatters; + + private readonly string _mainTableName; + private readonly WhereClause _whereClause; + + public WhereClauseHandler(string mainTableName, WhereClause whereClause) + { + _mainTableName = mainTableName; + _whereClause = whereClause; + _expressionFormatters = new Dictionary, bool>>> + { + {SimpleExpressionType.And, LogicalExpressionToWhereClause}, + {SimpleExpressionType.Or, LogicalExpressionToWhereClause}, + {SimpleExpressionType.Equal, EqualExpressionToWhereClause}, + {SimpleExpressionType.NotEqual, NotEqualExpressionToWhereClause}, + {SimpleExpressionType.Function, FunctionExpressionToWhereClause}, + {SimpleExpressionType.GreaterThan, GreaterThanToWhereClause}, + {SimpleExpressionType.LessThan, LessThanToWhereClause}, + {SimpleExpressionType.GreaterThanOrEqual, GreaterThanOrEqualToWhereClause}, + {SimpleExpressionType.LessThanOrEqual, LessThanOrEqualToWhereClause}, + {SimpleExpressionType.Empty, expr => _ => true }, + }; + } + + private Func, bool> FunctionExpressionToWhereClause(SimpleExpression arg) + { + var function = arg.RightOperand as SimpleFunction; + if (ReferenceEquals(function, null)) throw new InvalidOperationException("Expression type of function but no function supplied."); + if (function.Name.Equals("like", StringComparison.OrdinalIgnoreCase) || + function.Name.Equals("notlike", StringComparison.OrdinalIgnoreCase)) + { + var pattern = function.Args[0].ToString(); + if (pattern.Contains("%") || pattern.Contains("_")) // SQL Server LIKE + { + pattern = pattern.Replace("%", ".*").Replace('_', '.'); + } + + var regex = new Regex("^" + pattern + "$", RegexOptions.Multiline | RegexOptions.IgnoreCase); + + if (function.Name.Equals("like", StringComparison.OrdinalIgnoreCase)) + { + return d => Resolve(d, arg.LeftOperand).Count > 0 && Resolve(d, arg.LeftOperand).OfType().Any(regex.IsMatch); + } + if (function.Name.Equals("notlike", StringComparison.OrdinalIgnoreCase)) + { + return d => Resolve(d, arg.LeftOperand).Count > 0 && Resolve(d, arg.LeftOperand).OfType().All(input => !regex.IsMatch(input)); + } + } + + throw new NotSupportedException("Expression Function not supported."); + } + + private Func, bool> GreaterThanToWhereClause(SimpleExpression arg) + { + return d => Resolve(d, arg.LeftOperand).OfType().Any(o => o.CompareTo(arg.RightOperand) > 0); + } + + private Func, bool> LessThanToWhereClause(SimpleExpression arg) + { + return d => Resolve(d, arg.LeftOperand).OfType().Any(o => o.CompareTo(arg.RightOperand) < 0); + } + + private Func, bool> GreaterThanOrEqualToWhereClause(SimpleExpression arg) + { + return d => Resolve(d, arg.LeftOperand).OfType().Any(o => o.CompareTo(arg.RightOperand) >= 0); + } + + private Func, bool> LessThanOrEqualToWhereClause(SimpleExpression arg) + { + return d => Resolve(d, arg.LeftOperand).OfType().Any(o => o.CompareTo(arg.RightOperand) <= 0); + } + + private Func, bool> NotEqualExpressionToWhereClause(SimpleExpression arg) + { + var equal = EqualExpressionToWhereClause(arg); + return d => !equal(d); + } + + private Func, bool> EqualExpressionToWhereClause(SimpleExpression arg) + { + if (ReferenceEquals(arg.RightOperand, null)) + { + return d => Resolve(d, arg.LeftOperand).Count == 0 || Resolve(d, arg.LeftOperand).Any(o => ReferenceEquals(o, null)); + } + + if (arg.RightOperand.GetType().IsArray) + { + return + d => + { + var resolvedLeftOperand = Resolve(d, arg.LeftOperand); + if (resolvedLeftOperand.OfType().Any()) + { + return resolvedLeftOperand.OfType().Any( + o => o.Cast().SequenceEqual(((IEnumerable)arg.RightOperand).Cast())); + } + return resolvedLeftOperand.Any( + o => ((IEnumerable)arg.RightOperand).Cast().Contains(o)); + }; + } + + return d => Resolve(d, arg.LeftOperand).Contains(arg.RightOperand); + } + + private Func, bool> Format(SimpleExpression expression) + { + Func, bool>> formatter; + + if (_expressionFormatters.TryGetValue(expression.Type, out formatter)) + { + return formatter(expression); + } + + return _ => true; + } + + private Func, bool> LogicalExpressionToWhereClause(SimpleExpression arg) + { + var left = Format((SimpleExpression)arg.LeftOperand); + var right = Format((SimpleExpression)arg.RightOperand); + + if (arg.Type == SimpleExpressionType.Or) + { + return d => (left(d) || right(d)); + } + return d => (left(d) && right(d)); + } + + private IList Resolve(IDictionary dict, object operand, string key = null) + { + var objectReference = operand as ObjectReference; + if (objectReference.IsNull()) return new object[0]; + + key = key ?? objectReference.GetAliasOrName(); + var keys = objectReference.GetAllObjectNames(); + + if (keys.Length > 2) + { + if (_mainTableName.Contains(".")) + { + keys = keys.Skip(1).ToArray(); + keys[0] = _mainTableName; + } + } + if (keys.Length > 2) + { + return ResolveSubs(dict, objectReference.GetOwner(), key).ToList(); + } + + if (keys.Length == 2 && !HomogenizedEqualityComparer.DefaultInstance.Equals(keys[0].Singularize(), _mainTableName.Singularize())) + { + var joinedDict = dict[keys[0]] as IDictionary; + if (joinedDict != null && joinedDict.ContainsKey(keys[1])) + { + return new[] { joinedDict[keys[1]] }; + } + + var joinedDicts = dict[keys[0]] as IEnumerable>; + if (joinedDicts != null) + { + return joinedDicts.Select(d => d.ContainsKey(keys[1]) ? d[keys[1]] : null).ToArray(); + } + } + + if (dict.ContainsKey(key)) + return new[] { dict[key] }; + + return new object[0]; + } + + private IEnumerable ResolveSubs(IDictionary dict, ObjectReference objectReference, string key) + { + if (objectReference.IsNull()) return Enumerable.Empty(); + + if (dict.ContainsKey(objectReference.GetName())) + { + var master = dict[objectReference.GetName()] as IDictionary; + if (master != null) + { + if (master.ContainsKey(key)) + { + return new[] { master[key] }; + } + } + + var detail = dict[objectReference.GetName()] as IEnumerable>; + if (detail != null) + { + return detail.SelectMany(d => Resolve(d, objectReference, key)); + } + } + + return ResolveSubs(dict, objectReference.GetOwner(), key); + } + + public IEnumerable> Run(IEnumerable> source) + { + var predicate = Format(_whereClause.Criteria); + return source.Where(predicate); + } + } } \ No newline at end of file diff --git a/Simple.Data/RunStrategy.cs b/Simple.Data/RunStrategy.cs index dfaca998..8f3aa79a 100644 --- a/Simple.Data/RunStrategy.cs +++ b/Simple.Data/RunStrategy.cs @@ -1,92 +1,87 @@ -namespace Simple.Data -{ - using System.Collections.Generic; - using System.Linq; - - internal abstract class RunStrategy - { - protected abstract Adapter Adapter { get; } - - /// - /// Finds data from the specified "table". - /// - /// Name of the table. - /// The criteria. This may be null, in which case all records should be returned. - /// The list of records matching the criteria. If no records are found, return an empty list. - internal abstract IEnumerable> Find(string tableName, SimpleExpression criteria); - - /// - /// Inserts a record into the specified "table". - /// Name of the table.The values to insert.If possible, return the newly inserted row, including any automatically-set values such as primary keys or timestamps. - internal abstract IEnumerable> InsertMany(string tableName, IEnumerable> enumerable, ErrorCallback onError, bool resultRequired); - - /// - /// Inserts many records into the specified "table". - /// Name of the table.The values to insert.If possible, return the newly inserted row, including any automatically-set values such as primary keys or timestamps. - internal abstract IDictionary Insert(string tableName, IDictionary data, bool resultRequired); - - /// - /// Updates the specified "table" according to specified criteria. - /// Name of the table.The new values.The expression to use as criteria for the update operation.The number of records affected by the update operation. - internal abstract int Update(string tableName, IDictionary data, SimpleExpression criteria); - - /// - /// Deletes from the specified table. - /// Name of the table.The expression to use as criteria for the delete operation.The number of records which were deleted. - internal abstract int Delete(string tableName, SimpleExpression criteria); - - internal abstract IDictionary FindOne(string getQualifiedName, SimpleExpression criteriaExpression); - - internal abstract int UpdateMany(string tableName, IList> dataList); - - internal abstract int UpdateMany(string tableName, IList> dataList, IEnumerable criteriaFieldNames); - - internal abstract int UpdateMany(string tableName, IList> newValuesList, - IList> originalValuesList); - - internal abstract int Update(string tableName, IDictionary newValuesDict, IDictionary originalValuesDict); - - public abstract IEnumerable> UpsertMany(string tableName, IList> list, IEnumerable keyFieldNames, bool isResultRequired, ErrorCallback errorCallback); - - public abstract IDictionary Upsert(string tableName, IDictionary dict, SimpleExpression criteriaExpression, bool isResultRequired); - - public abstract IEnumerable> UpsertMany(string tableName, IList> list, bool isResultRequired, ErrorCallback errorCallback); - - public abstract IDictionary Get(string tableName, object[] args); - - public abstract IEnumerable> RunQuery(SimpleQuery query, out IEnumerable unhandledClauses); - - protected static Dictionary CreateChangedValuesDict( - IEnumerable> newValuesDict, IDictionary originalValuesDict) - { - var changedValuesDict = - newValuesDict.Where( - kvp => - (!originalValuesDict.ContainsKey(kvp.Key)) || !(Equals(kvp.Value, originalValuesDict[kvp.Key]))) - .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); - return changedValuesDict; - } - - protected SimpleExpression CreateCriteriaFromOriginalValues(string tableName, - IDictionary newValuesDict, - IDictionary - originalValuesDict) - { - var criteriaValues = Adapter.GetKey(tableName, originalValuesDict); - - foreach (var kvp in originalValuesDict - .Where( - originalKvp => - newValuesDict.ContainsKey(originalKvp.Key) && - !(Equals(newValuesDict[originalKvp.Key], originalKvp.Value)))) - { - if (!criteriaValues.ContainsKey(kvp.Key)) - { - criteriaValues.Add(kvp); - } - }; - - return ExpressionHelper.CriteriaDictionaryToExpression(tableName, criteriaValues); - } - } +using Simple.Data.Operations; + +namespace Simple.Data +{ + using System.Collections.Generic; + using System.Linq; + + internal abstract class RunStrategy + { + protected abstract Adapter Adapter { get; } + + /// + /// Finds data from the specified "table". + /// + /// Name of the table. + /// The criteria. This may be null, in which case all records should be returned. + /// The list of records matching the criteria. If no records are found, return an empty list. + internal abstract IEnumerable> Find(FindOperation operation); + + /// + /// Inserts many records into the specified "table". + /// + /// + /// Name of the table.The values to insert.If possible, return the newly inserted row, including any automatically-set values such as primary keys or timestamps. + internal abstract IEnumerable> Insert(InsertOperation operation); + + /// + /// Updates the specified "table" according to specified criteria. + /// Name of the table.The new values.The expression to use as criteria for the update operation.The number of records affected by the update operation. + internal abstract int Update(string tableName, IReadOnlyDictionary newValuesDict, IReadOnlyDictionary originalValuesDict); + + internal abstract int Update(string tableName, IReadOnlyDictionary data, SimpleExpression criteria); + + /// + /// Deletes from the specified table. + /// Name of the table.The expression to use as criteria for the delete operation.The number of records which were deleted. + internal abstract int Delete(string tableName, SimpleExpression criteria); + + internal abstract IReadOnlyDictionary FindOne(FindOperation operation); + + internal abstract int UpdateMany(string tableName, IList> list); + + internal abstract int UpdateMany(string tableName, IList> dataList, IEnumerable criteriaFieldNames); + + internal abstract int UpdateMany(string tableName, IList> newValuesList, + IList> originalValuesList); + + public abstract IEnumerable> Upsert(UpsertOperation operation); + + public abstract IReadOnlyDictionary Get(GetOperation operation); + + public abstract IEnumerable> RunQuery(SimpleQuery query, out IEnumerable unhandledClauses); + + protected static Dictionary CreateChangedValuesDict( + IEnumerable> newValuesDict, IReadOnlyDictionary originalValuesDict) + { + var changedValuesDict = + newValuesDict.Where( + kvp => + (!originalValuesDict.ContainsKey(kvp.Key)) || !(Equals(kvp.Value, originalValuesDict[kvp.Key]))) + .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); + return changedValuesDict; + } + + protected SimpleExpression CreateCriteriaFromOriginalValues(string tableName, + IReadOnlyDictionary newValuesDict, + IReadOnlyDictionary + originalValuesDict) + { + var criteriaValues = Adapter.GetKey(tableName, originalValuesDict).ToDictionary(); + + foreach (var kvp in originalValuesDict + .Where( + originalKvp => + newValuesDict.ContainsKey(originalKvp.Key) && + !(Equals(newValuesDict[originalKvp.Key], originalKvp.Value)))) + { + if (!criteriaValues.ContainsKey(kvp.Key)) + { + criteriaValues.Add(kvp); + } + }; + + return ExpressionHelper.CriteriaDictionaryToExpression(tableName, criteriaValues); + } + } } \ No newline at end of file diff --git a/Simple.Data/Simple.Data.csproj b/Simple.Data/Simple.Data.csproj index 7bdf50df..1486f113 100644 --- a/Simple.Data/Simple.Data.csproj +++ b/Simple.Data/Simple.Data.csproj @@ -1,223 +1,233 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Library - Properties - Simple.Data - Simple.Data - 512 - - - - - - - - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - SecurityRules.ruleset - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - CommonAssemblyInfo.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Library + Properties + Simple.Data + Simple.Data + 512 + + + + + + + + + v4.5 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + SecurityRules.ruleset + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + + CommonAssemblyInfo.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + \ No newline at end of file diff --git a/Simple.Data/SimpleRecord.cs b/Simple.Data/SimpleRecord.cs index 8af28aaf..6e40dd18 100644 --- a/Simple.Data/SimpleRecord.cs +++ b/Simple.Data/SimpleRecord.cs @@ -1,169 +1,194 @@ -using System; -using System.Collections.Generic; -using System.Dynamic; -using System.Linq; -using System.Text; -using System.Threading; -using Simple.Data.Extensions; - -namespace Simple.Data -{ - public partial class SimpleRecord : DynamicObject, ICloneable - { - private static readonly DictionaryCloner Cloner = new DictionaryCloner(); - private readonly ConcreteObject _concreteObject = new ConcreteObject(); - private readonly IDictionary _data; - private readonly DataStrategy _database; - private readonly string _tableName; - - public SimpleRecord() - { - _data = new Dictionary(HomogenizedEqualityComparer.DefaultInstance); - } - - public SimpleRecord(DataStrategy database) - { - _data = new Dictionary(HomogenizedEqualityComparer.DefaultInstance); - _database = database; - } - - public SimpleRecord(IDictionary data) - : this(data, null) - { - } - - public SimpleRecord(IDictionary data, string tableName) - : this(data, tableName, null) - { - } - - public SimpleRecord(IDictionary data, string tableName, DataStrategy dataStrategy) - { - _tableName = tableName; - _database = dataStrategy; - _data = data ?? new Dictionary(); - } - - public override bool TryGetMember(GetMemberBinder binder, out object result) - { - if (_data.ContainsKey(binder.Name)) - { - result = _data[binder.Name]; - var converted = ConvertResult(result); - if (!ReferenceEquals(result, converted)) - _data[binder.Name] = result = converted; - - return true; - } - - if (_tableName == null) - { - result = null; - return false; - } - - if (_database != null) - { - try - { - var relatedAdapter = _database.GetAdapter() as IAdapterWithRelation; - if (relatedAdapter != null && relatedAdapter.IsValidRelation(_tableName, binder.Name)) - { - result = GetRelatedData(binder, relatedAdapter); - return true; - } - } - catch (UnresolvableObjectException e) - { - throw new UnresolvableObjectException(e.ObjectName, string.Format("Column '{0}' not found.", e.ObjectName), e); - } - } - return base.TryGetMember(binder, out result); - } - - private object GetRelatedData(GetMemberBinder binder, IAdapterWithRelation relatedAdapter) - { - object result; - var related = relatedAdapter.FindRelated(_tableName, _data, binder.Name); - var query = related as SimpleQuery; - if (query != null) - { - query.SetDataStrategy(_database); - result = query; - } - else - { - result = related is IDictionary - ? (object) new SimpleRecord(related as IDictionary, binder.Name, _database) - : ((IEnumerable>) related).Select( - dict => new SimpleRecord(dict, binder.Name, _database)).ToList(); - _data[binder.Name] = result; - - } - return result; - } - - public override bool TrySetMember(SetMemberBinder binder, object value) - { - _data[binder.Name] = value; - return true; - } - - public override bool TryConvert(ConvertBinder binder, out object result) - { - result = _concreteObject.Get(binder.Type, _data); - return result != null; - } - - public override IEnumerable GetDynamicMemberNames() - { - return _data.Keys.AsEnumerable(); - } - - private object ConvertResult(object result) - { - if (result is SimpleList || result is SimpleRecord) return result; - - var subRecord = result as IDictionary; - if (subRecord != null) - return new SimpleRecord(subRecord); - - var list = result as IEnumerable; - if (list != null) - { - return new SimpleList(list.Select(ConvertResult)); - } - - var func = result as Func, object>; - if (func != null) - { - result = func(_data); - } - - return result; - } - - /// - /// Creates a new object that is a copy of the current instance. - /// - /// - /// A new object that is a copy of this instance. - /// - public object Clone() - { - return new SimpleRecord(Cloner.CloneDictionary(_data), _tableName, _database); - } - - public object ToScalar() - { - if (_data == null || _data.Count == 0) return null; - return _data.First().Value; - } - - public T ToScalar() - { - if (_data == null || _data.Count == 0) return default(T); - return (T)_data.First().Value; - } - } +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Text; +using System.Threading; +using Simple.Data.Extensions; + +namespace Simple.Data +{ + public partial class SimpleRecord : DynamicObject, ICloneable + { + private static readonly DictionaryCloner Cloner = new DictionaryCloner(); + private readonly ConcreteObject _concreteObject = new ConcreteObject(); + private readonly IDictionary _data; + private readonly DataStrategy _database; + private readonly string _tableName; + + public SimpleRecord() + { + _data = new Dictionary(HomogenizedEqualityComparer.DefaultInstance); + } + + public SimpleRecord(DataStrategy database) + { + _data = new Dictionary(HomogenizedEqualityComparer.DefaultInstance); + _database = database; + } + + public SimpleRecord(IReadOnlyDictionary data) + : this(data, null) + { + } + + public SimpleRecord(IReadOnlyDictionary data, string tableName) + : this(data, tableName, null) + { + } + + public SimpleRecord(IReadOnlyDictionary data, string tableName, DataStrategy dataStrategy) + { + _tableName = tableName; + _database = dataStrategy; + if (data == null) + { + _data = new Dictionary(); + } + else + { + _data = data as IDictionary || data.ToDictionary(); + } + } + + + public SimpleRecord(IDictionary data) + : this(data, null) + { + } + + public SimpleRecord(IDictionary data, string tableName) + : this(data, tableName, null) + { + } + + public SimpleRecord(IDictionary data, string tableName, DataStrategy dataStrategy) + { + _tableName = tableName; + _database = dataStrategy; + _data = data ?? new Dictionary(); + } + + public override bool TryGetMember(GetMemberBinder binder, out object result) + { + if (_data.ContainsKey(binder.Name)) + { + result = _data[binder.Name]; + var converted = ConvertResult(result); + if (!ReferenceEquals(result, converted)) + _data[binder.Name] = result = converted; + + return true; + } + + if (_tableName == null) + { + result = null; + return false; + } + + if (_database != null) + { + try + { + var relatedAdapter = _database.GetAdapter() as IAdapterWithRelation; + if (relatedAdapter != null && relatedAdapter.IsValidRelation(_tableName, binder.Name)) + { + result = GetRelatedData(binder, relatedAdapter); + return true; + } + } + catch (UnresolvableObjectException e) + { + throw new UnresolvableObjectException(e.ObjectName, string.Format("Column '{0}' not found.", e.ObjectName), e); + } + } + return base.TryGetMember(binder, out result); + } + + private object GetRelatedData(GetMemberBinder binder, IAdapterWithRelation relatedAdapter) + { + object result; + var related = relatedAdapter.FindRelated(_tableName, _data, binder.Name); + var query = related as SimpleQuery; + if (query != null) + { + query.SetDataStrategy(_database); + result = query; + } + else + { + result = related is IDictionary + ? (object) new SimpleRecord(related as IDictionary, binder.Name, _database) + : ((IEnumerable>) related).Select( + dict => new SimpleRecord(dict, binder.Name, _database)).ToList(); + _data[binder.Name] = result; + + } + return result; + } + + public override bool TrySetMember(SetMemberBinder binder, object value) + { + _data[binder.Name] = value; + return true; + } + + public override bool TryConvert(ConvertBinder binder, out object result) + { + result = _concreteObject.Get(binder.Type, _data); + return result != null; + } + + public override IEnumerable GetDynamicMemberNames() + { + return _data.Keys.AsEnumerable(); + } + + private object ConvertResult(object result) + { + if (result is SimpleList || result is SimpleRecord) return result; + + var subRecord = result as IDictionary; + if (subRecord != null) + return new SimpleRecord(subRecord); + + var list = result as IEnumerable; + if (list != null) + { + return new SimpleList(list.Select(ConvertResult)); + } + + var func = result as Func, object>; + if (func != null) + { + result = func(_data); + } + + return result; + } + + /// + /// Creates a new object that is a copy of the current instance. + /// + /// + /// A new object that is a copy of this instance. + /// + public object Clone() + { + return new SimpleRecord(Cloner.CloneDictionary(_data), _tableName, _database); + } + + public object ToScalar() + { + if (_data == null || _data.Count == 0) return null; + return _data.First().Value; + } + + public T ToScalar() + { + if (_data == null || _data.Count == 0) return default(T); + return (T)_data.First().Value; + } + } } \ No newline at end of file diff --git a/Simple.Data/SimpleResultSet.cs b/Simple.Data/SimpleResultSet.cs index 68072043..13100c8f 100644 --- a/Simple.Data/SimpleResultSet.cs +++ b/Simple.Data/SimpleResultSet.cs @@ -1,318 +1,318 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Dynamic; -using System.Linq; -using System.Linq.Expressions; -using System.Text; - -namespace Simple.Data -{ - public sealed class SimpleResultSet : DynamicObject, IEnumerable - { - public static readonly SimpleResultSet Empty = new SimpleResultSet(); - - private readonly IEnumerable> _sources; - private readonly IEnumerator> _sourceEnumerator; - private bool _hasCurrent; - private IDictionary _outputValues; - - private SimpleResultSet() : this(Enumerable.Empty>()) - { - - } - - public SimpleResultSet(params IEnumerable[] sources) : this (sources.AsEnumerable()) - { - } - - public SimpleResultSet(IEnumerable> sources) - { - _sources = sources; - _sourceEnumerator = _sources.GetEnumerator(); - _hasCurrent = _sourceEnumerator.MoveNext(); - } - - public IDictionary OutputValues - { - get { return _outputValues; } - } - - public object ReturnValue - { - get { return (_outputValues != null && _outputValues.ContainsKey("__ReturnValue")) ? _outputValues["__ReturnValue"] : 0; } - } - - public bool NextResult() - { - return _hasCurrent = (_hasCurrent && _sourceEnumerator.MoveNext()); - } - - public IEnumerable Cast() - { - return new CastEnumerable(_sourceEnumerator.Current); - } - - public IEnumerable OfType() - { - return new OfTypeEnumerable(_sourceEnumerator.Current); - } - - public IList ToList() - { - return _sourceEnumerator.Current.ToList(); - } - - public dynamic[] ToArray() - { - return _sourceEnumerator.Current.ToArray(); - } - - public IList ToList() - { - return Cast().ToList(); - } - - public T[] ToArray() - { - return Cast().ToArray(); - } - - public IList ToScalarList() - { - return ToScalarEnumerable().ToList(); - } - - public dynamic[] ToScalarArray() - { - return ToScalarEnumerable().ToArray(); - } - - public IList ToScalarList() - { - return ToScalarEnumerable().Cast().ToList(); - } - - public T[] ToScalarArray() - { - return ToScalarEnumerable().Cast().ToArray(); - } - - private IEnumerable ToScalarEnumerable() - { - return _sourceEnumerator.Current.OfType>().Select(dict => dict.Values.FirstOrDefault()); - } - - public dynamic First() - { - return _sourceEnumerator.Current.First(); - } - - public dynamic FirstOrDefault() - { - return _sourceEnumerator.Current.FirstOrDefault(); - } - - public T First() - { - return Cast().First(); - } - - public T FirstOrDefault() - { - return Cast().FirstOrDefault(); - } - - public T First(Func predicate) - { - return Cast().First(predicate); - } - - public T FirstOrDefault(Func predicate) - { - return Cast().FirstOrDefault(predicate); - } - - public dynamic Last() - { - return _sourceEnumerator.Current.Last(); - } - - public dynamic LastOrDefault() - { - return _sourceEnumerator.Current.LastOrDefault(); - } - - public T Last() - { - return Cast().Last(); - } - - public T LastOrDefault() - { - return Cast().LastOrDefault(); - } - - public T Last(Func predicate) - { - return Cast().Last(predicate); - } - - public T LastOrDefault(Func predicate) - { - return Cast().LastOrDefault(predicate); - } - - public dynamic Single() - { - return _sourceEnumerator.Current.Single(); - } - - public dynamic SingleOrDefault() - { - return _sourceEnumerator.Current.SingleOrDefault(); - } - - public T Single() - { - return Cast().Single(); - } - - public T SingleOrDefault() - { - return Cast().SingleOrDefault(); - } - - public T Single(Func predicate) - { - return Cast().Single(predicate); - } - - public T SingleOrDefault(Func predicate) - { - return Cast().SingleOrDefault(predicate); - } - - /// - /// Returns an enumerator that iterates through the collection. - /// - /// - /// A that can be used to iterate through the collection. - /// - /// 1 - public IEnumerator GetEnumerator() - { - return new DynamicEnumerator(_sourceEnumerator.Current); - } - - public override bool TryConvert(ConvertBinder binder, out object result) - { - if (binder.Type == typeof(IEnumerable)) - { - result = Cast(); - return true; - } - - if (ConcreteCollectionTypeCreator.IsCollectionType(binder.Type)) - { - if (ConcreteCollectionTypeCreator.TryCreate(binder.Type, this, out result)) - return true; - } - - return base.TryConvert(binder, out result); - } - - class DynamicEnumerator : IEnumerator, IDisposable - { - private readonly IEnumerator _enumerator; - - public DynamicEnumerator(IEnumerable source) - { - _enumerator = source.GetEnumerator(); - } - - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - /// 2 - public void Dispose() - { - _enumerator.Dispose(); - } - - /// - /// Advances the enumerator to the next element of the collection. - /// - /// - /// true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection. - /// - /// The collection was modified after the enumerator was created. 2 - public bool MoveNext() - { - return _enumerator.MoveNext(); - } - - /// - /// Sets the enumerator to its initial position, which is before the first element in the collection. - /// - /// The collection was modified after the enumerator was created. 2 - public void Reset() - { - _enumerator.Reset(); - } - - /// - /// Gets the current element in the collection. - /// - /// - /// The current element in the collection. - /// - /// The enumerator is positioned before the first element of the collection or after the last element.2 - public object Current - { - get { return _enumerator.Current; } - } - } - - /// - /// Creates a single-set from the specified source. - /// - /// The source. - public static SimpleResultSet Create(IEnumerable> source) - { - var q = from dict in source - select new SimpleRecord(dict); - return new SimpleResultSet(q); - } - - /// - /// Creates a single-set from the specified source. - /// - /// The source. - public static SimpleResultSet Create(IEnumerable> source, string tableName, DataStrategy dataStrategy) - { - var q = from dict in source - where dict != null - select new SimpleRecord(dict, tableName, dataStrategy); - return new SimpleResultSet(q); - } - - /// - /// Creates a multi-set from the specified sources. - /// - /// The sources. - /// - public static SimpleResultSet Create(IEnumerable>> sources) - { - var q = from source in sources - select from dict in source - select new SimpleRecord(dict); - return new SimpleResultSet(q); - } - - internal void SetOutputValues(IDictionary outputValues) - { - _outputValues = outputValues; - } - } -} +using System; +using System.Collections; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; + +namespace Simple.Data +{ + public sealed class SimpleResultSet : DynamicObject, IEnumerable + { + public static readonly SimpleResultSet Empty = new SimpleResultSet(); + + private readonly IEnumerable> _sources; + private readonly IEnumerator> _sourceEnumerator; + private bool _hasCurrent; + private IReadOnlyDictionary _outputValues; + + private SimpleResultSet() : this(Enumerable.Empty>()) + { + + } + + public SimpleResultSet(params IEnumerable[] sources) : this (sources.AsEnumerable()) + { + } + + public SimpleResultSet(IEnumerable> sources) + { + _sources = sources; + _sourceEnumerator = _sources.GetEnumerator(); + _hasCurrent = _sourceEnumerator.MoveNext(); + } + + public IReadOnlyDictionary OutputValues + { + get { return _outputValues; } + } + + public object ReturnValue + { + get { return (_outputValues != null && _outputValues.ContainsKey("__ReturnValue")) ? _outputValues["__ReturnValue"] : 0; } + } + + public bool NextResult() + { + return _hasCurrent = (_hasCurrent && _sourceEnumerator.MoveNext()); + } + + public IEnumerable Cast() + { + return new CastEnumerable(_sourceEnumerator.Current); + } + + public IEnumerable OfType() + { + return new OfTypeEnumerable(_sourceEnumerator.Current); + } + + public IList ToList() + { + return _sourceEnumerator.Current.ToList(); + } + + public dynamic[] ToArray() + { + return _sourceEnumerator.Current.ToArray(); + } + + public IList ToList() + { + return Cast().ToList(); + } + + public T[] ToArray() + { + return Cast().ToArray(); + } + + public IList ToScalarList() + { + return ToScalarEnumerable().ToList(); + } + + public dynamic[] ToScalarArray() + { + return ToScalarEnumerable().ToArray(); + } + + public IList ToScalarList() + { + return ToScalarEnumerable().Cast().ToList(); + } + + public T[] ToScalarArray() + { + return ToScalarEnumerable().Cast().ToArray(); + } + + private IEnumerable ToScalarEnumerable() + { + return _sourceEnumerator.Current.OfType>().Select(dict => dict.Values.FirstOrDefault()); + } + + public dynamic First() + { + return _sourceEnumerator.Current.First(); + } + + public dynamic FirstOrDefault() + { + return _sourceEnumerator.Current.FirstOrDefault(); + } + + public T First() + { + return Cast().First(); + } + + public T FirstOrDefault() + { + return Cast().FirstOrDefault(); + } + + public T First(Func predicate) + { + return Cast().First(predicate); + } + + public T FirstOrDefault(Func predicate) + { + return Cast().FirstOrDefault(predicate); + } + + public dynamic Last() + { + return _sourceEnumerator.Current.Last(); + } + + public dynamic LastOrDefault() + { + return _sourceEnumerator.Current.LastOrDefault(); + } + + public T Last() + { + return Cast().Last(); + } + + public T LastOrDefault() + { + return Cast().LastOrDefault(); + } + + public T Last(Func predicate) + { + return Cast().Last(predicate); + } + + public T LastOrDefault(Func predicate) + { + return Cast().LastOrDefault(predicate); + } + + public dynamic Single() + { + return _sourceEnumerator.Current.Single(); + } + + public dynamic SingleOrDefault() + { + return _sourceEnumerator.Current.SingleOrDefault(); + } + + public T Single() + { + return Cast().Single(); + } + + public T SingleOrDefault() + { + return Cast().SingleOrDefault(); + } + + public T Single(Func predicate) + { + return Cast().Single(predicate); + } + + public T SingleOrDefault(Func predicate) + { + return Cast().SingleOrDefault(predicate); + } + + /// + /// Returns an enumerator that iterates through the collection. + /// + /// + /// A that can be used to iterate through the collection. + /// + /// 1 + public IEnumerator GetEnumerator() + { + return new DynamicEnumerator(_sourceEnumerator.Current); + } + + public override bool TryConvert(ConvertBinder binder, out object result) + { + if (binder.Type == typeof(IEnumerable)) + { + result = Cast(); + return true; + } + + if (ConcreteCollectionTypeCreator.IsCollectionType(binder.Type)) + { + if (ConcreteCollectionTypeCreator.TryCreate(binder.Type, this, out result)) + return true; + } + + return base.TryConvert(binder, out result); + } + + class DynamicEnumerator : IEnumerator, IDisposable + { + private readonly IEnumerator _enumerator; + + public DynamicEnumerator(IEnumerable source) + { + _enumerator = source.GetEnumerator(); + } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + /// 2 + public void Dispose() + { + _enumerator.Dispose(); + } + + /// + /// Advances the enumerator to the next element of the collection. + /// + /// + /// true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection. + /// + /// The collection was modified after the enumerator was created. 2 + public bool MoveNext() + { + return _enumerator.MoveNext(); + } + + /// + /// Sets the enumerator to its initial position, which is before the first element in the collection. + /// + /// The collection was modified after the enumerator was created. 2 + public void Reset() + { + _enumerator.Reset(); + } + + /// + /// Gets the current element in the collection. + /// + /// + /// The current element in the collection. + /// + /// The enumerator is positioned before the first element of the collection or after the last element.2 + public object Current + { + get { return _enumerator.Current; } + } + } + + /// + /// Creates a single-set from the specified source. + /// + /// The source. + public static SimpleResultSet Create(IEnumerable> source) + { + var q = from dict in source + select new SimpleRecord(dict); + return new SimpleResultSet(q); + } + + /// + /// Creates a single-set from the specified source. + /// + /// The source. + public static SimpleResultSet Create(IEnumerable> source, string tableName, DataStrategy dataStrategy) + { + var q = from dict in source + where dict != null + select new SimpleRecord(dict, tableName, dataStrategy); + return new SimpleResultSet(q); + } + + /// + /// Creates a multi-set from the specified sources. + /// + /// The sources. + /// + public static SimpleResultSet Create(IEnumerable>> sources) + { + var q = from source in sources + select from dict in source + select new SimpleRecord(dict); + return new SimpleResultSet(q); + } + + internal void SetOutputValues(IReadOnlyDictionary outputValues) + { + _outputValues = outputValues; + } + } +} diff --git a/Simple.Data/TransactionRunner.cs b/Simple.Data/TransactionRunner.cs index 7c3943fa..d48d044b 100644 --- a/Simple.Data/TransactionRunner.cs +++ b/Simple.Data/TransactionRunner.cs @@ -1,107 +1,86 @@ -namespace Simple.Data -{ - using System.Collections.Generic; - using System.Linq; - - internal class TransactionRunner : RunStrategy - { - private readonly IAdapterWithTransactions _adapter; - private readonly IAdapterTransaction _adapterTransaction; - - public TransactionRunner(IAdapterWithTransactions adapter, IAdapterTransaction adapterTransaction) - { - _adapter = adapter; - _adapterTransaction = adapterTransaction; - } - - protected override Adapter Adapter - { - get { return (Adapter) _adapter; } - } - - internal override IDictionary FindOne(string tableName, SimpleExpression criteria) - { - return Find(tableName, criteria).FirstOrDefault(); - } - - internal override int UpdateMany(string tableName, IList> dataList) - { - return _adapter.UpdateMany(tableName, dataList, _adapterTransaction); - } - - internal override int UpdateMany(string tableName, IList> dataList, IEnumerable criteriaFieldNames) - { - return _adapter.UpdateMany(tableName, dataList, criteriaFieldNames, _adapterTransaction); - } - - internal override IEnumerable> Find(string tableName, SimpleExpression criteria) - { - return _adapter.Find(tableName, criteria, _adapterTransaction); - } - - internal override IDictionary Insert(string tableName, IDictionary data, bool resultRequired) - { - return _adapter.Insert(tableName, data, _adapterTransaction, resultRequired); - } - - /// - /// Inserts a record into the specified "table". - /// Name of the table.The values to insert.If possible, return the newly inserted row, including any automatically-set values such as primary keys or timestamps. - internal override IEnumerable> InsertMany(string tableName, IEnumerable> data, ErrorCallback onError, bool resultRequired) - { - return _adapter.InsertMany(tableName, data, _adapterTransaction, (dict, exception) => onError(new SimpleRecord(dict), exception), resultRequired); - } - - internal override int Update(string tableName, IDictionary data, SimpleExpression criteria) - { - return _adapter.Update(tableName, data, criteria, _adapterTransaction); - } - - public override IDictionary Upsert(string tableName, IDictionary dict, SimpleExpression criteriaExpression, bool isResultRequired) - { - return _adapter.Upsert(tableName, dict, criteriaExpression, isResultRequired, _adapterTransaction); - } - - public override IEnumerable> UpsertMany(string tableName, IList> list, bool isResultRequired, ErrorCallback errorCallback) - { - return _adapter.UpsertMany(tableName, list, _adapterTransaction, isResultRequired, (dict, exception) => errorCallback(new SimpleRecord(dict), exception)); - } - - public override IDictionary Get(string tableName, object[] args) - { - return _adapter.Get(tableName, _adapterTransaction, args); - } - - public override IEnumerable> RunQuery(SimpleQuery query, out IEnumerable unhandledClauses) - { - return _adapter.RunQuery(query, _adapterTransaction, out unhandledClauses); - } - - public override IEnumerable> UpsertMany(string tableName, IList> list, IEnumerable keyFieldNames, bool isResultRequired, ErrorCallback errorCallback) - { - return _adapter.UpsertMany(tableName, list, keyFieldNames, _adapterTransaction, isResultRequired, (dict, exception) => errorCallback(new SimpleRecord(dict), exception)); - } - - internal override int UpdateMany(string tableName, IList> newValuesList, IList> originalValuesList) - { - int count = 0; - for (int i = 0; i < newValuesList.Count; i++) - { - count += Update(tableName, newValuesList[i], originalValuesList[i]); - } - return count; - } - - internal override int Update(string tableName, IDictionary newValuesDict, IDictionary originalValuesDict) - { - SimpleExpression criteria = CreateCriteriaFromOriginalValues(tableName, newValuesDict, originalValuesDict); - var changedValuesDict = CreateChangedValuesDict(newValuesDict, originalValuesDict); - return _adapter.Update(tableName, changedValuesDict, criteria, _adapterTransaction); - } - - internal override int Delete(string tableName, SimpleExpression criteria) - { - return _adapter.Delete(tableName, criteria, _adapterTransaction); - } - } +using Simple.Data.Operations; + +namespace Simple.Data +{ + using System.Collections.Generic; + using System.Linq; + + internal class TransactionRunner : RunStrategy + { + private readonly IAdapterWithTransactions _adapter; + private readonly IAdapterTransaction _adapterTransaction; + + public TransactionRunner(IAdapterWithTransactions adapter, IAdapterTransaction adapterTransaction) + { + _adapter = adapter; + _adapterTransaction = adapterTransaction; + } + + protected override Adapter Adapter + { + get { return (Adapter) _adapter; } + } + + internal override IReadOnlyDictionary FindOne(FindOperation operation) + { + return Find(operation).FirstOrDefault(); + } + + internal override int UpdateMany(string tableName, IList> dataList) + { + return _adapter.UpdateMany(tableName, dataList, _adapterTransaction); + } + + internal override int UpdateMany(string tableName, IList> dataList, IEnumerable criteriaFieldNames) + { + return _adapter.UpdateMany(tableName, dataList, criteriaFieldNames, _adapterTransaction); + } + + internal override int UpdateMany(string tableName, IList> newValuesList, IList> originalValuesList) + { + throw new System.NotImplementedException(); + } + + internal override IEnumerable> Find(FindOperation operation) + { + return _adapter.Find(operation, _adapterTransaction); + } + + internal override IEnumerable> Insert(InsertOperation operation) + { + return _adapter.Insert(operation, _adapterTransaction); + } + + internal override int Update(string tableName, IReadOnlyDictionary data, SimpleExpression criteria) + { + return _adapter.Update(tableName, data, criteria, _adapterTransaction); + } + + public override IEnumerable> Upsert(UpsertOperation operation) + { + return _adapter.Upsert(operation, _adapterTransaction); + } + + public override IReadOnlyDictionary Get(GetOperation operation) + { + return _adapter.Get(operation, _adapterTransaction); + } + + public override IEnumerable> RunQuery(SimpleQuery query, out IEnumerable unhandledClauses) + { + return _adapter.RunQuery(query, _adapterTransaction, out unhandledClauses); + } + + internal override int Update(string tableName, IReadOnlyDictionary newValuesDict, IReadOnlyDictionary originalValuesDict) + { + SimpleExpression criteria = CreateCriteriaFromOriginalValues(tableName, newValuesDict, originalValuesDict); + var changedValuesDict = CreateChangedValuesDict(newValuesDict, originalValuesDict); + return _adapter.Update(tableName, changedValuesDict, criteria, _adapterTransaction); + } + + internal override int Delete(string tableName, SimpleExpression criteria) + { + return _adapter.Delete(tableName, criteria, _adapterTransaction); + } + } } \ No newline at end of file diff --git a/Simple.Data/app.config b/Simple.Data/app.config index dce43878..f3aeafb2 100644 --- a/Simple.Data/app.config +++ b/Simple.Data/app.config @@ -1,11 +1,9 @@ - - - - - - - - - \ No newline at end of file + + + + + + + + + diff --git a/packages/NUnit.2.5.10.11092/NUnit.2.5.10.11092.nuspec b/packages/NUnit.2.5.10.11092/NUnit.2.5.10.11092.nuspec new file mode 100644 index 00000000..33f9e371 --- /dev/null +++ b/packages/NUnit.2.5.10.11092/NUnit.2.5.10.11092.nuspec @@ -0,0 +1,13 @@ + + + + NUnit + 2.5.10.11092 + NUnit + Charlie Poole + Charlie Poole + false + NUnit is a unit-testing framework for all .Net languages. Initially ported from JUnit, the current production release, version 2.5, is the sixth major release of this xUnit based unit testing tool for Microsoft .NET. + NUnit is a unit-testing framework for all .Net languages. Initially ported from JUnit, the current production release, version 2.5, is the sixth major release of this xUnit based unit testing tool for Microsoft .NET. + + \ No newline at end of file diff --git a/packages/NUnit.2.5.9.10348/Logo.ico b/packages/NUnit.2.5.9.10348/Logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..13c4ff9d5b03bd16bf4ebb2a909b5be799125457 GIT binary patch literal 1078 zcmcJNy^(`35QP`t#U4r^^05(PUpuq&kJ**jfczny{h|T28&q986dB8F<0uc|!I|e7t4J=dHVQG+;5uQ=t0e9PU_K2N&g@xa|%o|87K zEwdlm8y?v(yDacX`<|Br@AA)_6F%}}X|G!A$*WrT@XSl_4fW-*cr33u*BlSXHs>S$ uhEL7;twDPw+#(|wa^m+bdD&TCd90TIH-#xAtk%$|)SGWtJo4>4@7jM=Ne>tR literal 0 HcmV?d00001 diff --git a/packages/NUnit.2.5.9.10348/NUnit.2.5.9.10348.nuspec b/packages/NUnit.2.5.9.10348/NUnit.2.5.9.10348.nuspec new file mode 100644 index 00000000..7f81059f --- /dev/null +++ b/packages/NUnit.2.5.9.10348/NUnit.2.5.9.10348.nuspec @@ -0,0 +1,13 @@ + + + + NUnit + 2.5.9.10348 + NUnit + Charlie Poole + Charlie Poole + false + NUnit is a unit-testing framework for all .Net languages. Initially ported from JUnit, the current production release, version 2.5, is the sixth major release of this xUnit based unit testing tool for Microsoft .NET. + NUnit is a unit-testing framework for all .Net languages. Initially ported from JUnit, the current production release, version 2.5, is the sixth major release of this xUnit based unit testing tool for Microsoft .NET. + + \ No newline at end of file diff --git a/packages/NUnit.2.5.9.10348/NUnitFitTests.html b/packages/NUnit.2.5.9.10348/NUnitFitTests.html new file mode 100644 index 00000000..ca5cd4ff --- /dev/null +++ b/packages/NUnit.2.5.9.10348/NUnitFitTests.html @@ -0,0 +1,277 @@ + + + +

NUnit Acceptance Tests

+

+ Developers love self-referential programs! Hence, NUnit has always run all it's + own tests, even those that are not really unit tests. +

Now, beginning with NUnit 2.4, NUnit has top-level tests using Ward Cunningham's + FIT framework. At this time, the tests are pretty rudimentary, but it's a start + and it's a framework for doing more. +

Running the Tests

+

Open a console or shell window and navigate to the NUnit bin directory, which + contains this file. To run the test under Microsoft .Net, enter the command +

    runFile NUnitFitTests.html TestResults.html .
+ To run it under Mono, enter +
    mono runFile.exe NUnitFitTests.html TestResults.html .
+ Note the space and dot at the end of each command. The results of your test + will be in TestResults.html in the same directory. +

Platform and CLR Version

+ + + + +
NUnit.Fixtures.PlatformInfo
+

Verify Unit Tests

+

+ Load and run the NUnit unit tests, verifying that the results are as expected. + When these tests are run on different platforms, different numbers of tests may + be skipped, so the values for Skipped and Run tests are informational only. +

+ The number of tests in each assembly should be constant across all platforms - + any discrepancy usually means that one of the test source files was not + compiled on the platform. There should be no failures and no tests ignored. +

Note: + At the moment, the nunit.extensions.tests assembly is failing because the + fixture doesn't initialize addins in the test domain. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NUnit.Fixtures.AssemblyRunner
AssemblyTests()Run()Skipped()Ignored()Failures()
nunit.framework.tests.dll397  00
nunit.core.tests.dll355  00
nunit.util.tests.dll238  00
nunit.mocks.tests.dll43  00
nunit.extensions.tests.dll5  00
nunit-console.tests.dll40  00
nunit.uikit.tests.dll34  00
nunit-gui.tests.dll15  00
nunit.fixtures.tests.dll6  00
+

Code Snippet Tests

+

+ These tests create a test assembly from a snippet of code and then load and run + the tests that it contains, verifying that the structure of the loaded tests is + as expected and that the number of tests run, skipped, ignored or failed is + correct. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NUnit.Fixtures.SnippetRunner
CodeTree()Run()Skipped()Ignored()Failures()
public class TestClass
+{
+}
+
EMPTY0000
using NUnit.Framework;
+
+[TestFixture]
+public class TestClass
+{
+}
+
TestClass0000
using NUnit.Framework;
+
+[TestFixture]
+public class TestClass
+{
+    [Test]
+    public void T1() { }
+    [Test]
+    public void T2() { }
+    [Test]
+    public void T3() { }
+}
+
TestClass
+>T1
+>T2
+>T3
+
3000
using NUnit.Framework;
+
+[TestFixture]
+public class TestClass1
+{
+    [Test]
+    public void T1() { }
+}
+
+[TestFixture]
+public class TestClass2
+{
+    [Test]
+    public void T2() { }
+    [Test]
+    public void T3() { }
+}
+
TestClass1
+>T1
+TestClass2
+>T2
+>T3
+
3000
using NUnit.Framework;
+
+[TestFixture]
+public class TestClass
+{
+    [Test]
+    public void T1() { }
+    [Test, Ignore]
+    public void T2() { }
+    [Test]
+    public void T3() { }
+}
+
TestClass
+>T1
+>T2
+>T3
+
2010
using NUnit.Framework;
+
+[TestFixture]
+public class TestClass
+{
+    [Test]
+    public void T1() { }
+    [Test, Explicit]
+    public void T2() { }
+    [Test]
+    public void T3() { }
+}
+
TestClass
+>T1
+>T2
+>T3
+
2100
+

Summary Information

+ + + + +
fit.Summary
+ + diff --git a/packages/NUnit.2.5.9.10348/Tools/NUnitFitTests.html b/packages/NUnit.2.5.9.10348/Tools/NUnitFitTests.html new file mode 100644 index 00000000..ca5cd4ff --- /dev/null +++ b/packages/NUnit.2.5.9.10348/Tools/NUnitFitTests.html @@ -0,0 +1,277 @@ + + + +

NUnit Acceptance Tests

+

+ Developers love self-referential programs! Hence, NUnit has always run all it's + own tests, even those that are not really unit tests. +

Now, beginning with NUnit 2.4, NUnit has top-level tests using Ward Cunningham's + FIT framework. At this time, the tests are pretty rudimentary, but it's a start + and it's a framework for doing more. +

Running the Tests

+

Open a console or shell window and navigate to the NUnit bin directory, which + contains this file. To run the test under Microsoft .Net, enter the command +

    runFile NUnitFitTests.html TestResults.html .
+ To run it under Mono, enter +
    mono runFile.exe NUnitFitTests.html TestResults.html .
+ Note the space and dot at the end of each command. The results of your test + will be in TestResults.html in the same directory. +

Platform and CLR Version

+ + + + +
NUnit.Fixtures.PlatformInfo
+

Verify Unit Tests

+

+ Load and run the NUnit unit tests, verifying that the results are as expected. + When these tests are run on different platforms, different numbers of tests may + be skipped, so the values for Skipped and Run tests are informational only. +

+ The number of tests in each assembly should be constant across all platforms - + any discrepancy usually means that one of the test source files was not + compiled on the platform. There should be no failures and no tests ignored. +

Note: + At the moment, the nunit.extensions.tests assembly is failing because the + fixture doesn't initialize addins in the test domain. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NUnit.Fixtures.AssemblyRunner
AssemblyTests()Run()Skipped()Ignored()Failures()
nunit.framework.tests.dll397  00
nunit.core.tests.dll355  00
nunit.util.tests.dll238  00
nunit.mocks.tests.dll43  00
nunit.extensions.tests.dll5  00
nunit-console.tests.dll40  00
nunit.uikit.tests.dll34  00
nunit-gui.tests.dll15  00
nunit.fixtures.tests.dll6  00
+

Code Snippet Tests

+

+ These tests create a test assembly from a snippet of code and then load and run + the tests that it contains, verifying that the structure of the loaded tests is + as expected and that the number of tests run, skipped, ignored or failed is + correct. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NUnit.Fixtures.SnippetRunner
CodeTree()Run()Skipped()Ignored()Failures()
public class TestClass
+{
+}
+
EMPTY0000
using NUnit.Framework;
+
+[TestFixture]
+public class TestClass
+{
+}
+
TestClass0000
using NUnit.Framework;
+
+[TestFixture]
+public class TestClass
+{
+    [Test]
+    public void T1() { }
+    [Test]
+    public void T2() { }
+    [Test]
+    public void T3() { }
+}
+
TestClass
+>T1
+>T2
+>T3
+
3000
using NUnit.Framework;
+
+[TestFixture]
+public class TestClass1
+{
+    [Test]
+    public void T1() { }
+}
+
+[TestFixture]
+public class TestClass2
+{
+    [Test]
+    public void T2() { }
+    [Test]
+    public void T3() { }
+}
+
TestClass1
+>T1
+TestClass2
+>T2
+>T3
+
3000
using NUnit.Framework;
+
+[TestFixture]
+public class TestClass
+{
+    [Test]
+    public void T1() { }
+    [Test, Ignore]
+    public void T2() { }
+    [Test]
+    public void T3() { }
+}
+
TestClass
+>T1
+>T2
+>T3
+
2010
using NUnit.Framework;
+
+[TestFixture]
+public class TestClass
+{
+    [Test]
+    public void T1() { }
+    [Test, Explicit]
+    public void T2() { }
+    [Test]
+    public void T3() { }
+}
+
TestClass
+>T1
+>T2
+>T3
+
2100
+

Summary Information

+ + + + +
fit.Summary
+ + diff --git a/packages/NUnit.2.5.9.10348/Tools/NUnitTests.config b/packages/NUnit.2.5.9.10348/Tools/NUnitTests.config new file mode 100644 index 00000000..fb157715 --- /dev/null +++ b/packages/NUnit.2.5.9.10348/Tools/NUnitTests.config @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/NUnit.2.5.9.10348/Tools/NUnitTests.nunit b/packages/NUnit.2.5.9.10348/Tools/NUnitTests.nunit new file mode 100644 index 00000000..e7bb7f43 --- /dev/null +++ b/packages/NUnit.2.5.9.10348/Tools/NUnitTests.nunit @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/packages/NUnit.2.5.9.10348/Tools/agent.conf b/packages/NUnit.2.5.9.10348/Tools/agent.conf new file mode 100644 index 00000000..ddbcd8ea --- /dev/null +++ b/packages/NUnit.2.5.9.10348/Tools/agent.conf @@ -0,0 +1,4 @@ + + 8080 + . + \ No newline at end of file diff --git a/packages/NUnit.2.5.9.10348/Tools/agent.log.conf b/packages/NUnit.2.5.9.10348/Tools/agent.log.conf new file mode 100644 index 00000000..4bd90ca4 --- /dev/null +++ b/packages/NUnit.2.5.9.10348/Tools/agent.log.conf @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/packages/NUnit.2.5.9.10348/Tools/launcher.log.conf b/packages/NUnit.2.5.9.10348/Tools/launcher.log.conf new file mode 100644 index 00000000..4bd90ca4 --- /dev/null +++ b/packages/NUnit.2.5.9.10348/Tools/launcher.log.conf @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/packages/NUnit.2.5.9.10348/Tools/lib/Failure.png b/packages/NUnit.2.5.9.10348/Tools/lib/Failure.png new file mode 100644 index 0000000000000000000000000000000000000000..2e400b276fcd227a2f056b4a2c704a3a17776bf2 GIT binary patch literal 1445 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`)E9 z;1l8sRKUo{$jk&pOzh0e>?|xCtgIXy9AX@7f`WolBEl*>9IAX==Hfz@lA;O<3Z|x} z=H}*(GUDEnLVmJhVG{fi(t<7u(jH2(0Sb~Ks&cUk;@+wXk-8eO#(GKWa-pH2$ss|h zp~2Ke@2e>~Y_E0LUi+wv!C_DH6K+N)-Azt;nV<2oIOl71F3|2`ko~DZ zhsz<3S3;eyg}dH}_PiDAeIw52M!etQ;dFk&lg!9x zxiPQH(%x6+%xtKg)mS&HsqSDyX-iAX#EBDU&z?PJ&YbPrx9{1r=fZ^x*REXy2Gl4R zej%{GtG*hT1sF<#{DS|FY`_rwom~|e!<+>kk;T9Q2$?i7*PM82?WL(g zN`WPzD}+VwdMv!tclO`E`;B||X1=U6{T!X0cGlpZ__Dns(^Q{q33<@@B{==%nWLWe zk1k$d-u?gaXS02Y?em%@UT;|X`Le6Q9%a@~-wSg4Dw&gQuTA7S^0aqm1jFsXn`gLK zuT`(x(RJ!s_RG_k0(5hn3;4_C?KACI9eX3|FH6Gy)$UIicifXYyG!~|)yo?vi~jBW z6jT{=a3z2Dp~83PY7E{_76^TyV3HAkJ?rKNS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`)E9 z;1l8sR3IV3CMCuuBf%yw#V#+yE-S?^FDoh|Eg>f-CoeCrq`;x7$f=^tsj9-Mp$sFr8r9QJqWp9JN1n((vk4)9WYVZyYLZYHDh3Zk{%6 z+U(i0=ggV2ZQHi(+qd7_JNN$nxepFbyLRo`{rmS{9XSXL&rvXhLg0aY?KWVZVkimn z3;sW{0YmV2c2!{1aTa()76S{QYaq-xA-{4CP*9@8HKHUqKdq!Zu_%=xATcwqM94ZLo|YufAq6S9Qc#sYAG36YapyLLGk>-bH|RITgV`K;&Dp4 zNJ!Ykgrw`OD?F|zU))eouw`|VL?6U#FuR-@+LO+}L)C2jq= zW9lKJMyAYvZGncJoU;!7nZ(AJnZTH=KEFa&Q!q6Ac)=+(gsSzopr024hF%>V!Z literal 0 HcmV?d00001 diff --git a/packages/NUnit.2.5.9.10348/Tools/lib/Inconclusive.png b/packages/NUnit.2.5.9.10348/Tools/lib/Inconclusive.png new file mode 100644 index 0000000000000000000000000000000000000000..4807b7cedbc70436d121f9052bdf719cf2e692ed GIT binary patch literal 1436 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`)E9 z;1l8s(!-;v$fu>mr>!iYtt6tUDypL{qOT^Vt0bYJBB8A!rKK*Rt0Qk@EN!c;ps%fD zpr>e}r)s39Zm6$mXsBy!qvh-)o9Lz!=xO8cZ4?%09~ER96Q+?FW|$Ufk(q2+7U~t1 z=2@KXSDY14R#9G2TT@$KU!QH+Sm7{nsr{u{5j$FQC(J5Yy}V@qDzB>xV-BnhxV}E< z#)i-v%af09O1ru(@y_;?I~y}E@65QjJNy2g{QDbfj%}(txux>_&a!K}Dy|)>dfd>^ z(9+z}+uPgU-#@iw?zFaf)22*=ZP=V$w$ot^OV-0Y|Km*2m- z@a@fIuWzh)|6=3yms@T*mXFhFlJ$A(H^yZVhQkhwqa=!#$zBDQ}POMF^Q*x%A)1RPa-{KM&m0#}=i4RPCS&+>>!C^t~!qAdQeH&7owuBmZcyF7% zZ)WnIu7;vLi+5U|2w1SyZCYPoRaxJ(g$ddJ|CjR_noWKjV8CD6W_kCvu1AyiFkkj&ff-?id-yQAc$CUKbKq=bO)z4*}Q$iB}HW4*& literal 0 HcmV?d00001 diff --git a/packages/NUnit.2.5.9.10348/Tools/lib/Skipped.png b/packages/NUnit.2.5.9.10348/Tools/lib/Skipped.png new file mode 100644 index 0000000000000000000000000000000000000000..7c9fc64e3874e15f3f22a234083c1da3ce8d62b8 GIT binary patch literal 1405 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`)E9 z;1l8sRN(9D>+kO$5D*X;7#I{36d4&A6B82~8=H`jker;HmX?;8nVFT9m6MZ`o12@T zpI=Z=P*_-4R8&-4TwGF8Qe9nLQ&Ur0TU%FGS6^S>(9qD>*x1z6)ZEoQeotUc4CddXRJaa_yUX@}NK6`G*Q rap=JLd&hddy85ua{(ro-{sHGx)snNf1MdKfN(Kf`S3j3^P6NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`)E9 z;1l8sRKUo{$iT$F$i&FP&cejS#KytK&dtus&&t8a!79qiDb2|%%gbWKB5xwEsi|pi zZ!hR5DCQ_8m>_8BYiS!{tB|drnWkx$Z|30O;F9a&R^cQtT|ji2DC;^_{!RSCn}wye zOUdq#Rq0dFZPT@#YOA+736d-j|;b5^fjy?y)kzB9co_gm(kXq|kyZOXm=d3UF- zxj1e8wK-eQ%-ni$?$wK1u3ftZ42n@O(n8?#y__;&7GNj|@(cbyvH?TzcXm}^{Bss~ zL>2=JAYg{zy~a2pzj6*xP@=>&q9iy!t)x7$D3u`~F*C13&(AePq0Cs%*lgwVM<9)7 zJY5_^G=h_V^s`AE_`@OZ??1oe|Np)J|Fd&fNJ?d7NlEPTHmYb~z2o!biRe_3R0~Oo zAC63MYDEjzm0f!k!^6X*pexu`^zUIJBcBZq&!IL!2S)kYxVsM~C}^^=74jO(FKAdU zz&yERfxa~J{Kb8}>K+cQQyU%qTN*E3I(bV>4OIj9Z-1nd_^+fC85L>3(lN5 zaNymeob{wrblmH;2j<40nnP d7?&t8Fes)~X?EOwb{gm}22WQ%mvv4FO#qjX@@4=4 literal 0 HcmV?d00001 diff --git a/packages/NUnit.2.5.9.10348/Tools/nunit-agent-x86.exe.config b/packages/NUnit.2.5.9.10348/Tools/nunit-agent-x86.exe.config new file mode 100644 index 00000000..d840f37a --- /dev/null +++ b/packages/NUnit.2.5.9.10348/Tools/nunit-agent-x86.exe.config @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/NUnit.2.5.9.10348/Tools/nunit-agent.exe.config b/packages/NUnit.2.5.9.10348/Tools/nunit-agent.exe.config new file mode 100644 index 00000000..d840f37a --- /dev/null +++ b/packages/NUnit.2.5.9.10348/Tools/nunit-agent.exe.config @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/NUnit.2.5.9.10348/Tools/nunit-console-x86.exe.config b/packages/NUnit.2.5.9.10348/Tools/nunit-console-x86.exe.config new file mode 100644 index 00000000..fa0a2621 --- /dev/null +++ b/packages/NUnit.2.5.9.10348/Tools/nunit-console-x86.exe.config @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/NUnit.2.5.9.10348/Tools/nunit-console.exe.config b/packages/NUnit.2.5.9.10348/Tools/nunit-console.exe.config new file mode 100644 index 00000000..fa0a2621 --- /dev/null +++ b/packages/NUnit.2.5.9.10348/Tools/nunit-console.exe.config @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/NUnit.2.5.9.10348/Tools/nunit-x86.exe.config b/packages/NUnit.2.5.9.10348/Tools/nunit-x86.exe.config new file mode 100644 index 00000000..1641a501 --- /dev/null +++ b/packages/NUnit.2.5.9.10348/Tools/nunit-x86.exe.config @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/NUnit.2.5.9.10348/Tools/nunit.exe.config b/packages/NUnit.2.5.9.10348/Tools/nunit.exe.config new file mode 100644 index 00000000..1641a501 --- /dev/null +++ b/packages/NUnit.2.5.9.10348/Tools/nunit.exe.config @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/NUnit.2.5.9.10348/Tools/pnunit-agent.exe.config b/packages/NUnit.2.5.9.10348/Tools/pnunit-agent.exe.config new file mode 100644 index 00000000..0bf29b34 --- /dev/null +++ b/packages/NUnit.2.5.9.10348/Tools/pnunit-agent.exe.config @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/NUnit.2.5.9.10348/Tools/pnunit-launcher.exe.config b/packages/NUnit.2.5.9.10348/Tools/pnunit-launcher.exe.config new file mode 100644 index 00000000..0bf29b34 --- /dev/null +++ b/packages/NUnit.2.5.9.10348/Tools/pnunit-launcher.exe.config @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/NUnit.2.5.9.10348/Tools/runFile.exe.config b/packages/NUnit.2.5.9.10348/Tools/runFile.exe.config new file mode 100644 index 00000000..f58f099b --- /dev/null +++ b/packages/NUnit.2.5.9.10348/Tools/runFile.exe.config @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/NUnit.2.5.9.10348/Tools/runpnunit.bat b/packages/NUnit.2.5.9.10348/Tools/runpnunit.bat new file mode 100644 index 00000000..a05cbb7d --- /dev/null +++ b/packages/NUnit.2.5.9.10348/Tools/runpnunit.bat @@ -0,0 +1,2 @@ +start pnunit-agent agent.conf +pnunit-launcher test.conf \ No newline at end of file diff --git a/packages/NUnit.2.5.9.10348/Tools/test.conf b/packages/NUnit.2.5.9.10348/Tools/test.conf new file mode 100644 index 00000000..14cd1130 --- /dev/null +++ b/packages/NUnit.2.5.9.10348/Tools/test.conf @@ -0,0 +1,24 @@ + + + + + Testing + + + Testing + pnunit.tests.dll + TestLibraries.Testing.EqualTo19 + localhost:8080 + + ..\server + + + + + + + + + + + \ No newline at end of file diff --git a/packages/NUnit.2.5.9.10348/fit-license.txt b/packages/NUnit.2.5.9.10348/fit-license.txt new file mode 100644 index 00000000..e5408d92 --- /dev/null +++ b/packages/NUnit.2.5.9.10348/fit-license.txt @@ -0,0 +1,342 @@ + + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. \ No newline at end of file diff --git a/packages/NUnit.2.5.9.10348/lib/nunit.framework.xml b/packages/NUnit.2.5.9.10348/lib/nunit.framework.xml new file mode 100644 index 00000000..1cccec3b --- /dev/null +++ b/packages/NUnit.2.5.9.10348/lib/nunit.framework.xml @@ -0,0 +1,10385 @@ + + + + nunit.framework + + + + + Attribute used to apply a category to a test + + + + + The name of the category + + + + + Construct attribute for a given category based on + a name. The name may not contain the characters ',', + '+', '-' or '!'. However, this is not checked in the + constructor since it would cause an error to arise at + as the test was loaded without giving a clear indication + of where the problem is located. The error is handled + in NUnitFramework.cs by marking the test as not + runnable. + + The name of the category + + + + Protected constructor uses the Type name as the name + of the category. + + + + + The name of the category + + + + + Used to mark a field for use as a datapoint when executing a theory + within the same fixture that requires an argument of the field's Type. + + + + + Used to mark an array as containing a set of datapoints to be used + executing a theory within the same fixture that requires an argument + of the Type of the array elements. + + + + + Attribute used to provide descriptive text about a + test case or fixture. + + + + + Construct the attribute + + Text describing the test + + + + Gets the test description + + + + + Enumeration indicating how the expected message parameter is to be used + + + + Expect an exact match + + + Expect a message containing the parameter string + + + Match the regular expression provided as a parameter + + + Expect a message that starts with the parameter string + + + + ExpectedExceptionAttribute + + + + + + Constructor for a non-specific exception + + + + + Constructor for a given type of exception + + The type of the expected exception + + + + Constructor for a given exception name + + The full name of the expected exception + + + + Gets or sets the expected exception type + + + + + Gets or sets the full Type name of the expected exception + + + + + Gets or sets the expected message text + + + + + Gets or sets the user message displayed in case of failure + + + + + Gets or sets the type of match to be performed on the expected message + + + + + Gets the name of a method to be used as an exception handler + + + + + ExplicitAttribute marks a test or test fixture so that it will + only be run if explicitly executed from the gui or command line + or if it is included by use of a filter. The test will not be + run simply because an enclosing suite is run. + + + + + Default constructor + + + + + Constructor with a reason + + The reason test is marked explicit + + + + The reason test is marked explicit + + + + + Attribute used to mark a test that is to be ignored. + Ignored tests result in a warning message when the + tests are run. + + + + + Constructs the attribute without giving a reason + for ignoring the test. + + + + + Constructs the attribute giving a reason for ignoring the test + + The reason for ignoring the test + + + + The reason for ignoring a test + + + + + Abstract base for Attributes that are used to include tests + in the test run based on environmental settings. + + + + + Constructor with no included items specified, for use + with named property syntax. + + + + + Constructor taking one or more included items + + Comma-delimited list of included items + + + + Name of the item that is needed in order for + a test to run. Multiple itemss may be given, + separated by a comma. + + + + + Name of the item to be excluded. Multiple items + may be given, separated by a comma. + + + + + The reason for including or excluding the test + + + + + PlatformAttribute is used to mark a test fixture or an + individual method as applying to a particular platform only. + + + + + Constructor with no platforms specified, for use + with named property syntax. + + + + + Constructor taking one or more platforms + + Comma-deliminted list of platforms + + + + CultureAttribute is used to mark a test fixture or an + individual method as applying to a particular Culture only. + + + + + Constructor with no cultures specified, for use + with named property syntax. + + + + + Constructor taking one or more cultures + + Comma-deliminted list of cultures + + + + Marks a test to use a combinatorial join of any argument data + provided. NUnit will create a test case for every combination of + the arguments provided. This can result in a large number of test + cases and so should be used judiciously. This is the default join + type, so the attribute need not be used except as documentation. + + + + + PropertyAttribute is used to attach information to a test as a name/value pair.. + + + + + Construct a PropertyAttribute with a name and string value + + The name of the property + The property value + + + + Construct a PropertyAttribute with a name and int value + + The name of the property + The property value + + + + Construct a PropertyAttribute with a name and double value + + The name of the property + The property value + + + + Constructor for derived classes that set the + property dictionary directly. + + + + + Constructor for use by derived classes that use the + name of the type as the property name. Derived classes + must ensure that the Type of the property value is + a standard type supported by the BCL. Any custom + types will cause a serialization Exception when + in the client. + + + + + Gets the property dictionary for this attribute + + + + + Default constructor + + + + + Marks a test to use pairwise join of any argument data provided. + NUnit will attempt too excercise every pair of argument values at + least once, using as small a number of test cases as it can. With + only two arguments, this is the same as a combinatorial join. + + + + + Default constructor + + + + + Marks a test to use a sequential join of any argument data + provided. NUnit will use arguements for each parameter in + sequence, generating test cases up to the largest number + of argument values provided and using null for any arguments + for which it runs out of values. Normally, this should be + used with the same number of arguments for each parameter. + + + + + Default constructor + + + + + Summary description for MaxTimeAttribute. + + + + + Construct a MaxTimeAttribute, given a time in milliseconds. + + The maximum elapsed time in milliseconds + + + + RandomAttribute is used to supply a set of random values + to a single parameter of a parameterized test. + + + + + ValuesAttribute is used to provide literal arguments for + an individual parameter of a test. + + + + + Abstract base class for attributes that apply to parameters + and supply data for the parameter. + + + + + Gets the data to be provided to the specified parameter + + + + + The collection of data to be returned. Must + be set by any derived attribute classes. + We use an object[] so that the individual + elements may have their type changed in GetData + if necessary. + + + + + Construct with one argument + + + + + + Construct with two arguments + + + + + + + Construct with three arguments + + + + + + + + Construct with an array of arguments + + + + + + Get the collection of values to be used as arguments + + + + + Construct a set of doubles from 0.0 to 1.0, + specifying only the count. + + + + + + Construct a set of doubles from min to max + + + + + + + + Construct a set of ints from min to max + + + + + + + + Get the collection of values to be used as arguments + + + + + RangeAttribute is used to supply a range of values to an + individual parameter of a parameterized test. + + + + + Construct a range of ints using default step of 1 + + + + + + + Construct a range of ints specifying the step size + + + + + + + + Construct a range of longs + + + + + + + + Construct a range of doubles + + + + + + + + Construct a range of floats + + + + + + + + RepeatAttribute may be applied to test case in order + to run it multiple times. + + + + + Construct a RepeatAttribute + + The number of times to run the test + + + + RequiredAddinAttribute may be used to indicate the names of any addins + that must be present in order to run some or all of the tests in an + assembly. If the addin is not loaded, the entire assembly is marked + as NotRunnable. + + + + + Initializes a new instance of the class. + + The required addin. + + + + Gets the name of required addin. + + The required addin name. + + + + Summary description for SetCultureAttribute. + + + + + Construct given the name of a culture + + + + + + Summary description for SetUICultureAttribute. + + + + + Construct given the name of a culture + + + + + + Attribute used to mark a class that contains one-time SetUp + and/or TearDown methods that apply to all the tests in a + namespace or an assembly. + + + + + SetUpFixtureAttribute is used to identify a SetUpFixture + + + + + Attribute used to mark a static (shared in VB) property + that returns a list of tests. + + + + + Attribute used to identify a method that is called + immediately after each test is run. The method is + guaranteed to be called, even if an exception is thrown. + + + + + Adding this attribute to a method within a + class makes the method callable from the NUnit test runner. There is a property + called Description which is optional which you can provide a more detailed test + description. This class cannot be inherited. + + + + [TestFixture] + public class Fixture + { + [Test] + public void MethodToTest() + {} + + [Test(Description = "more detailed description")] + publc void TestDescriptionMethod() + {} + } + + + + + + Descriptive text for this test + + + + + TestCaseAttribute is used to mark parameterized test cases + and provide them with their arguments. + + + + + The ITestCaseData interface is implemented by a class + that is able to return complete testcases for use by + a parameterized test method. + + NOTE: This interface is used in both the framework + and the core, even though that results in two different + types. However, sharing the source code guarantees that + the various implementations will be compatible and that + the core is able to reflect successfully over the + framework implementations of ITestCaseData. + + + + + Gets the argument list to be provided to the test + + + + + Gets the expected result + + + + + Gets the expected exception Type + + + + + Gets the FullName of the expected exception + + + + + Gets the name to be used for the test + + + + + Gets the description of the test + + + + + Gets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets the ignore reason. + + The ignore reason. + + + + Construct a TestCaseAttribute with a list of arguments. + This constructor is not CLS-Compliant + + + + + + Construct a TestCaseAttribute with a single argument + + + + + + Construct a TestCaseAttribute with a two arguments + + + + + + + Construct a TestCaseAttribute with a three arguments + + + + + + + + Gets the list of arguments to a test case + + + + + Gets or sets the expected result. + + The result. + + + + Gets or sets the expected exception. + + The expected exception. + + + + Gets or sets the name the expected exception. + + The expected name of the exception. + + + + Gets or sets the expected message of the expected exception + + The expected message of the exception. + + + + Gets or sets the type of match to be performed on the expected message + + + + + Gets or sets the description. + + The description. + + + + Gets or sets the name of the test. + + The name of the test. + + + + Gets or sets the ignored status of the test + + + + + Gets or sets the ignored status of the test + + + + + Gets the ignore reason. + + The ignore reason. + + + + FactoryAttribute indicates the source to be used to + provide test cases for a test method. + + + + + Construct with the name of the factory - for use with languages + that don't support params arrays. + + An array of the names of the factories that will provide data + + + + Construct with a Type and name - for use with languages + that don't support params arrays. + + The Type that will provide data + The name of the method, property or field that will provide data + + + + The name of a the method, property or fiend to be used as a source + + + + + A Type to be used as a source + + + + + [TestFixture] + public class ExampleClass + {} + + + + + Default constructor + + + + + Construct with a object[] representing a set of arguments. + In .NET 2.0, the arguments may later be separated into + type arguments and constructor arguments. + + + + + + Descriptive text for this fixture + + + + + The arguments originally provided to the attribute + + + + + Gets or sets a value indicating whether this should be ignored. + + true if ignore; otherwise, false. + + + + Gets or sets the ignore reason. May set Ignored as a side effect. + + The ignore reason. + + + + Get or set the type arguments. If not set + explicitly, any leading arguments that are + Types are taken as type arguments. + + + + + Attribute used to identify a method that is + called before any tests in a fixture are run. + + + + + Attribute used to identify a method that is called after + all the tests in a fixture have run. The method is + guaranteed to be called, even if an exception is thrown. + + + + + Adding this attribute to a method within a + class makes the method callable from the NUnit test runner. There is a property + called Description which is optional which you can provide a more detailed test + description. This class cannot be inherited. + + + + [TestFixture] + public class Fixture + { + [Test] + public void MethodToTest() + {} + + [Test(Description = "more detailed description")] + publc void TestDescriptionMethod() + {} + } + + + + + + WUsed on a method, marks the test with a timeout value in milliseconds. + The test will be run in a separate thread and is cancelled if the timeout + is exceeded. Used on a method or assembly, sets the default timeout + for all contained test methods. + + + + + Construct a TimeoutAttribute given a time in milliseconds + + The timeout value in milliseconds + + + + Marks a test that must run in the STA, causing it + to run in a separate thread if necessary. + + On methods, you may also use STAThreadAttribute + to serve the same purpose. + + + + + Construct a RequiresSTAAttribute + + + + + Marks a test that must run in the MTA, causing it + to run in a separate thread if necessary. + + On methods, you may also use MTAThreadAttribute + to serve the same purpose. + + + + + Construct a RequiresMTAAttribute + + + + + Marks a test that must run on a separate thread. + + + + + Construct a RequiresThreadAttribute + + + + + Construct a RequiresThreadAttribute, specifying the apartment + + + + + ValueSourceAttribute indicates the source to be used to + provide data for one parameter of a test method. + + + + + Construct with the name of the factory - for use with languages + that don't support params arrays. + + The name of the data source to be used + + + + Construct with a Type and name - for use with languages + that don't support params arrays. + + The Type that will provide data + The name of the method, property or field that will provide data + + + + The name of a the method, property or fiend to be used as a source + + + + + A Type to be used as a source + + + + + AttributeExistsConstraint tests for the presence of a + specified attribute on a Type. + + + + + The Constraint class is the base of all built-in constraints + within NUnit. It provides the operator overloads used to combine + constraints. + + + + + The IConstraintExpression interface is implemented by all + complete and resolvable constraints and expressions. + + + + + Return the top-level constraint for this expression + + + + + + Static UnsetObject used to detect derived constraints + failing to set the actual value. + + + + + The actual value being tested against a constraint + + + + + The display name of this Constraint for use by ToString() + + + + + Argument fields used by ToString(); + + + + + The builder holding this constraint + + + + + Construct a constraint with no arguments + + + + + Construct a constraint with one argument + + + + + Construct a constraint with two arguments + + + + + Sets the ConstraintBuilder holding this constraint + + + + + Write the failure message to the MessageWriter provided + as an argument. The default implementation simply passes + the constraint and the actual value to the writer, which + then displays the constraint description and the value. + + Constraints that need to provide additional details, + such as where the error occured can override this. + + The MessageWriter on which to display the message + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Test whether the constraint is satisfied by an + ActualValueDelegate that returns the value to be tested. + The default implementation simply evaluates the delegate + but derived classes may override it to provide for delayed + processing. + + An ActualValueDelegate + True for success, false for failure + + + + Test whether the constraint is satisfied by a given reference. + The default implementation simply dereferences the value but + derived classes may override it to provide for delayed processing. + + A reference to the value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + Default override of ToString returns the constraint DisplayName + followed by any arguments within angle brackets. + + + + + + Returns the string representation of this constraint + + + + + This operator creates a constraint that is satisfied only if both + argument constraints are satisfied. + + + + + This operator creates a constraint that is satisfied if either + of the argument constraints is satisfied. + + + + + This operator creates a constraint that is satisfied if the + argument constraint is not satisfied. + + + + + Returns a DelayedConstraint with the specified delay time. + + The delay in milliseconds. + + + + + Returns a DelayedConstraint with the specified delay time + and polling interval. + + The delay in milliseconds. + The interval at which to test the constraint. + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + Returns a ConstraintExpression by appending And + to the current constraint. + + + + + Returns a ConstraintExpression by appending And + to the current constraint. + + + + + Returns a ConstraintExpression by appending Or + to the current constraint. + + + + + Class used to detect any derived constraints + that fail to set the actual value in their + Matches override. + + + + + Constructs an AttributeExistsConstraint for a specific attribute Type + + + + + + Tests whether the object provides the expected attribute. + + A Type, MethodInfo, or other ICustomAttributeProvider + True if the expected attribute is present, otherwise false + + + + Writes the description of the constraint to the specified writer + + + + + AttributeConstraint tests that a specified attribute is present + on a Type or other provider and that the value of the attribute + satisfies some other constraint. + + + + + Abstract base class used for prefixes + + + + + The base constraint + + + + + Construct given a base constraint + + + + + + Constructs an AttributeConstraint for a specified attriute + Type and base constraint. + + + + + + + Determines whether the Type or other provider has the + expected attribute and if its value matches the + additional constraint specified. + + + + + Writes a description of the attribute to the specified writer. + + + + + Writes the actual value supplied to the specified writer. + + + + + Returns a string representation of the constraint. + + + + + BasicConstraint is the abstract base for constraints that + perform a simple comparison to a constant value. + + + + + Initializes a new instance of the class. + + The expected. + The description. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + NullConstraint tests that the actual value is null + + + + + Initializes a new instance of the class. + + + + + TrueConstraint tests that the actual value is true + + + + + Initializes a new instance of the class. + + + + + FalseConstraint tests that the actual value is false + + + + + Initializes a new instance of the class. + + + + + NaNConstraint tests that the actual value is a double or float NaN + + + + + Test that the actual value is an NaN + + + + + + + Write the constraint description to a specified writer + + + + + + BinaryConstraint is the abstract base of all constraints + that combine two other constraints in some fashion. + + + + + The first constraint being combined + + + + + The second constraint being combined + + + + + Construct a BinaryConstraint from two other constraints + + The first constraint + The second constraint + + + + AndConstraint succeeds only if both members succeed. + + + + + Create an AndConstraint from two other constraints + + The first constraint + The second constraint + + + + Apply both member constraints to an actual value, succeeding + succeeding only if both of them succeed. + + The actual value + True if the constraints both succeeded + + + + Write a description for this contraint to a MessageWriter + + The MessageWriter to receive the description + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + OrConstraint succeeds if either member succeeds + + + + + Create an OrConstraint from two other constraints + + The first constraint + The second constraint + + + + Apply the member constraints to an actual value, succeeding + succeeding as soon as one of them succeeds. + + The actual value + True if either constraint succeeded + + + + Write a description for this contraint to a MessageWriter + + The MessageWriter to receive the description + + + + CollectionConstraint is the abstract base class for + constraints that operate on collections. + + + + + Construct an empty CollectionConstraint + + + + + Construct a CollectionConstraint + + + + + + Determines whether the specified enumerable is empty. + + The enumerable. + + true if the specified enumerable is empty; otherwise, false. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Protected method to be implemented by derived classes + + + + + + + CollectionItemsEqualConstraint is the abstract base class for all + collection constraints that apply some notion of item equality + as a part of their operation. + + + + + Construct an empty CollectionConstraint + + + + + Construct a CollectionConstraint + + + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied Comparison object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Compares two collection members for equality + + + + + Return a new CollectionTally for use in making tests + + The collection to be included in the tally + + + + Flag the constraint to ignore case and return self. + + + + + EmptyCollectionConstraint tests whether a collection is empty. + + + + + Check that the collection is empty + + + + + + + Write the constraint description to a MessageWriter + + + + + + UniqueItemsConstraint tests whether all the items in a + collection are unique. + + + + + Check that all items are unique. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + CollectionContainsConstraint is used to test whether a collection + contains an expected object as a member. + + + + + Construct a CollectionContainsConstraint + + + + + + Test whether the expected item is contained in the collection + + + + + + + Write a descripton of the constraint to a MessageWriter + + + + + + CollectionEquivalentCOnstraint is used to determine whether two + collections are equivalent. + + + + + Construct a CollectionEquivalentConstraint + + + + + + Test whether two collections are equivalent + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + CollectionSubsetConstraint is used to determine whether + one collection is a subset of another + + + + + Construct a CollectionSubsetConstraint + + The collection that the actual value is expected to be a subset of + + + + Test whether the actual collection is a subset of + the expected collection provided. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + CollectionOrderedConstraint is used to test whether a collection is ordered. + + + + + Construct a CollectionOrderedConstraint + + + + + Modifies the constraint to use an IComparer and returns self. + + + + + Modifies the constraint to use an IComparer<T> and returns self. + + + + + Modifies the constraint to use a Comparison<T> and returns self. + + + + + Modifies the constraint to test ordering by the value of + a specified property and returns self. + + + + + Test whether the collection is ordered + + + + + + + Write a description of the constraint to a MessageWriter + + + + + + Returns the string representation of the constraint. + + + + + + If used performs a reverse comparison + + + + + CollectionTally counts (tallies) the number of + occurences of each object in one or more enumerations. + + + + + Construct a CollectionTally object from a comparer and a collection + + + + + Try to remove an object from the tally + + The object to remove + True if successful, false if the object was not found + + + + Try to remove a set of objects from the tally + + The objects to remove + True if successful, false if any object was not found + + + + The number of objects remaining in the tally + + + + + ComparisonAdapter class centralizes all comparisons of + values in NUnit, adapting to the use of any provided + IComparer, IComparer<T> or Comparison<T> + + + + + Returns a ComparisonAdapter that wraps an IComparer + + + + + Returns a ComparisonAdapter that wraps an IComparer<T> + + + + + Returns a ComparisonAdapter that wraps a Comparison<T> + + + + + Compares two objects + + + + + Gets the default ComparisonAdapter, which wraps an + NUnitComparer object. + + + + + Construct a ComparisonAdapter for an IComparer + + + + + Compares two objects + + + + + + + + Construct a default ComparisonAdapter + + + + + ComparisonAdapter<T> extends ComparisonAdapter and + allows use of an IComparer<T> or Comparison<T> + to actually perform the comparison. + + + + + Construct a ComparisonAdapter for an IComparer<T> + + + + + Compare a Type T to an object + + + + + Construct a ComparisonAdapter for a Comparison<T> + + + + + Compare a Type T to an object + + + + + Abstract base class for constraints that compare values to + determine if one is greater than, equal to or less than + the other. + + + + + The value against which a comparison is to be made + + + + + If true, less than returns success + + + + + if true, equal returns success + + + + + if true, greater than returns success + + + + + The predicate used as a part of the description + + + + + ComparisonAdapter to be used in making the comparison + + + + + Initializes a new instance of the class. + + The value against which to make a comparison. + if set to true less succeeds. + if set to true equal succeeds. + if set to true greater succeeds. + String used in describing the constraint. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Modifies the constraint to use an IComparer and returns self + + + + + Modifies the constraint to use an IComparer<T> and returns self + + + + + Modifies the constraint to use a Comparison<T> and returns self + + + + + Tests whether a value is greater than the value supplied to its constructor + + + + + Initializes a new instance of the class. + + The expected value. + + + + Tests whether a value is greater than or equal to the value supplied to its constructor + + + + + Initializes a new instance of the class. + + The expected value. + + + + Tests whether a value is less than the value supplied to its constructor + + + + + Initializes a new instance of the class. + + The expected value. + + + + Tests whether a value is less than or equal to the value supplied to its constructor + + + + + Initializes a new instance of the class. + + The expected value. + + + + Delegate used to delay evaluation of the actual value + to be used in evaluating a constraint + + + + + ConstraintBuilder maintains the stacks that are used in + processing a ConstraintExpression. An OperatorStack + is used to hold operators that are waiting for their + operands to be reognized. a ConstraintStack holds + input constraints as well as the results of each + operator applied. + + + + + Initializes a new instance of the class. + + + + + Appends the specified operator to the expression by first + reducing the operator stack and then pushing the new + operator on the stack. + + The operator to push. + + + + Appends the specified constraint to the expresson by pushing + it on the constraint stack. + + The constraint to push. + + + + Sets the top operator right context. + + The right context. + + + + Reduces the operator stack until the topmost item + precedence is greater than or equal to the target precedence. + + The target precedence. + + + + Resolves this instance, returning a Constraint. If the builder + is not currently in a resolvable state, an exception is thrown. + + The resolved constraint + + + + Gets a value indicating whether this instance is resolvable. + + + true if this instance is resolvable; otherwise, false. + + + + + OperatorStack is a type-safe stack for holding ConstraintOperators + + + + + Initializes a new instance of the class. + + The builder. + + + + Pushes the specified operator onto the stack. + + The op. + + + + Pops the topmost operator from the stack. + + + + + + Gets a value indicating whether this is empty. + + true if empty; otherwise, false. + + + + Gets the topmost operator without modifying the stack. + + The top. + + + + ConstraintStack is a type-safe stack for holding Constraints + + + + + Initializes a new instance of the class. + + The builder. + + + + Pushes the specified constraint. As a side effect, + the constraint's builder field is set to the + ConstraintBuilder owning this stack. + + The constraint. + + + + Pops this topmost constrait from the stack. + As a side effect, the constraint's builder + field is set to null. + + + + + + Gets a value indicating whether this is empty. + + true if empty; otherwise, false. + + + + Gets the topmost constraint without modifying the stack. + + The topmost constraint + + + + ConstraintExpression represents a compound constraint in the + process of being constructed from a series of syntactic elements. + + Individual elements are appended to the expression as they are + reognized. Once an actual Constraint is appended, the expression + returns a resolvable Constraint. + + + + + ConstraintExpressionBase is the abstract base class for the + generated ConstraintExpression class, which represents a + compound constraint in the process of being constructed + from a series of syntactic elements. + + NOTE: ConstraintExpressionBase is aware of some of its + derived classes, which is an apparent violation of + encapsulation. Ideally, these classes would be a + single class, but they must be separated in order to + allow parts to be generated under .NET 1.x and to + provide proper user feedback in syntactically + aware IDEs. + + + + + The ConstraintBuilder holding the elements recognized so far + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the + class passing in a ConstraintBuilder, which may be pre-populated. + + The builder. + + + + Returns a string representation of the expression as it + currently stands. This should only be used for testing, + since it has the side-effect of resolving the expression. + + + + + + Appends an operator to the expression and returns the + resulting expression itself. + + + + + Appends a self-resolving operator to the expression and + returns a new ResolvableConstraintExpression. + + + + + Appends a constraint to the expression and returns that + constraint, which is associated with the current state + of the expression being built. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the + class passing in a ConstraintBuilder, which may be pre-populated. + + The builder. + + + + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns the constraint provided as an argument - used to allow custom + custom constraints to easily participate in the syntax. + + + + + Returns the constraint provided as an argument - used to allow custom + custom constraints to easily participate in the syntax. + + + + + Returns a constraint that tests two items for equality + + + + + Returns a constraint that tests that two references are the same object + + + + + Returns a constraint that tests whether the + actual value is greater than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the Regex pattern supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the Regex pattern supplied as an argument. + + + + + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the actual value falls + within a specified range. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. + + + + + With is currently a NOP - reserved for future use. + + + + + Returns a constraint that tests for null + + + + + Returns a constraint that tests for True + + + + + Returns a constraint that tests for False + + + + + Returns a constraint that tests for NaN + + + + + Returns a constraint that tests for empty + + + + + Returns a constraint that tests whether a collection + contains all unique items. + + + + + Returns a constraint that tests whether an object graph is serializable in binary format. + + + + + Returns a constraint that tests whether an object graph is serializable in xml format. + + + + + Returns a constraint that tests whether a collection is ordered + + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a constraint that tests two items for equality + + + + + Returns a constraint that tests that two references are the same object + + + + + Returns a constraint that tests whether the + actual value is greater than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the Regex pattern supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the Regex pattern supplied as an argument. + + + + + Returns a constraint that fails if the actual + value matches the pattern supplied as an argument. + + + + + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the actual value falls + within a specified range. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. + + + + + Returns a constraint that tests for null + + + + + Returns a constraint that tests for True + + + + + Returns a constraint that tests for False + + + + + Returns a constraint that tests for NaN + + + + + Returns a constraint that tests for empty + + + + + Returns a constraint that tests whether a collection + contains all unique items. + + + + + Returns a constraint that tests whether an object graph is serializable in binary format. + + + + + Returns a constraint that tests whether an object graph is serializable in xml format. + + + + + Returns a constraint that tests whether a collection is ordered + + + + + The ConstraintOperator class is used internally by a + ConstraintBuilder to represent an operator that + modifies or combines constraints. + + Constraint operators use left and right precedence + values to determine whether the top operator on the + stack should be reduced before pushing a new operator. + + + + + The precedence value used when the operator + is about to be pushed to the stack. + + + + + The precedence value used when the operator + is on the top of the stack. + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + The syntax element preceding this operator + + + + + The syntax element folowing this operator + + + + + The precedence value used when the operator + is about to be pushed to the stack. + + + + + The precedence value used when the operator + is on the top of the stack. + + + + + PrefixOperator takes a single constraint and modifies + it's action in some way. + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Returns the constraint created by applying this + prefix to another constraint. + + + + + + + Negates the test of the constraint it wraps. + + + + + Constructs a new NotOperator + + + + + Returns a NotConstraint applied to its argument. + + + + + Abstract base for operators that indicate how to + apply a constraint to items in a collection. + + + + + Constructs a CollectionOperator + + + + + Represents a constraint that succeeds if all the + members of a collection match a base constraint. + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + they all succeed. + + + + + Represents a constraint that succeeds if any of the + members of a collection match a base constraint. + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + any of them succeed. + + + + + Represents a constraint that succeeds if none of the + members of a collection match a base constraint. + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + none of them succeed. + + + + + Represents a constraint that simply wraps the + constraint provided as an argument, without any + further functionality, but which modifes the + order of evaluation because of its precedence. + + + + + Constructor for the WithOperator + + + + + Returns a constraint that wraps its argument + + + + + Abstract base class for operators that are able to reduce to a + constraint whether or not another syntactic element follows. + + + + + Operator used to test for the presence of a named Property + on an object and optionally apply further tests to the + value of that property. + + + + + Constructs a PropOperator for a particular named property + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Gets the name of the property to which the operator applies + + + + + Operator that tests for the presence of a particular attribute + on a type and optionally applies further tests to the attribute. + + + + + Construct an AttributeOperator for a particular Type + + The Type of attribute tested + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + Operator that tests that an exception is thrown and + optionally applies further tests to the exception. + + + + + Construct a ThrowsOperator + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + Abstract base class for all binary operators + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Abstract method that produces a constraint by applying + the operator to its left and right constraint arguments. + + + + + Gets the left precedence of the operator + + + + + Gets the right precedence of the operator + + + + + Operator that requires both it's arguments to succeed + + + + + Construct an AndOperator + + + + + Apply the operator to produce an AndConstraint + + + + + Operator that requires at least one of it's arguments to succeed + + + + + Construct an OrOperator + + + + + Apply the operator to produce an OrConstraint + + + + + ContainsConstraint tests a whether a string contains a substring + or a collection contains an object. It postpones the decision of + which test to use until the type of the actual argument is known. + This allows testing whether a string is contained in a collection + or as a substring of another string using the same syntax. + + + + + Initializes a new instance of the class. + + The expected. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied Comparison object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to ignore case and return self. + + + + + Applies a delay to the match so that a match can be evaluated in the future. + + + + + Creates a new DelayedConstraint + + The inner constraint two decorate + The time interval after which the match is performed + If the value of is less than 0 + + + + Creates a new DelayedConstraint + + The inner constraint two decorate + The time interval after which the match is performed + The time interval used for polling + If the value of is less than 0 + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for if the base constraint fails, false if it succeeds + + + + Test whether the constraint is satisfied by a delegate + + The delegate whose value is to be tested + True for if the base constraint fails, false if it succeeds + + + + Test whether the constraint is satisfied by a given reference. + Overridden to wait for the specified delay period before + calling the base constraint with the dereferenced value. + + A reference to the value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a MessageWriter. + + The writer on which the actual value is displayed + + + + Returns the string representation of the constraint. + + + + + EmptyDirectoryConstraint is used to test that a directory is empty + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + EmptyConstraint tests a whether a string or collection is empty, + postponing the decision about which test is applied until the + type of the actual argument is known. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + EqualConstraint is able to compare an actual value with the + expected value provided in its constructor. Two objects are + considered equal if both are null, or if both have the same + value. NUnit has special semantics for some object types. + + + + + If true, strings in error messages will be clipped + + + + + NUnitEqualityComparer used to test equality. + + + + + Initializes a new instance of the class. + + The expected value. + + + + Flag the constraint to use a tolerance when determining equality. + + Tolerance value to be used + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied Comparison object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write a failure message. Overridden to provide custom + failure messages for EqualConstraint. + + The MessageWriter to write to + + + + Write description of this constraint + + The MessageWriter to write to + + + + Display the failure information for two collections that did not match. + + The MessageWriter on which to display + The expected collection. + The actual collection + The depth of this failure in a set of nested collections + + + + Displays a single line showing the types and sizes of the expected + and actual collections or arrays. If both are identical, the value is + only shown once. + + The MessageWriter on which to display + The expected collection or array + The actual collection or array + The indentation level for the message line + + + + Displays a single line showing the point in the expected and actual + arrays at which the comparison failed. If the arrays have different + structures or dimensions, both values are shown. + + The MessageWriter on which to display + The expected array + The actual array + Index of the failure point in the underlying collections + The indentation level for the message line + + + + Flag the constraint to ignore case and return self. + + + + + Flag the constraint to suppress string clipping + and return self. + + + + + Flag the constraint to compare arrays as collections + and return self. + + + + + Switches the .Within() modifier to interpret its tolerance as + a distance in representable values (see remarks). + + Self. + + Ulp stands for "unit in the last place" and describes the minimum + amount a given value can change. For any integers, an ulp is 1 whole + digit. For floating point values, the accuracy of which is better + for smaller numbers and worse for larger numbers, an ulp depends + on the size of the number. Using ulps for comparison of floating + point results instead of fixed tolerances is safer because it will + automatically compensate for the added inaccuracy of larger numbers. + + + + + Switches the .Within() modifier to interpret its tolerance as + a percentage that the actual values is allowed to deviate from + the expected value. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in days. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in hours. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in minutes. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in seconds. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in milliseconds. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in clock ticks. + + Self + + + + EqualityAdapter class handles all equality comparisons + that use an IEqualityComparer, IEqualityComparer<T> + or a ComparisonAdapter. + + + + + Compares two objects, returning true if they are equal + + + + + Returns an EqualityAdapter that wraps an IComparer. + + + + + Returns an EqualityAdapter that wraps an IEqualityComparer. + + + + + Returns an EqualityAdapter that wraps an IEqualityComparer<T>. + + + + + Returns an EqualityAdapter that wraps an IComparer<T>. + + + + + Returns an EqualityAdapter that wraps a Comparison<T>. + + + + Helper routines for working with floating point numbers + + + The floating point comparison code is based on this excellent article: + http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm + + + "ULP" means Unit in the Last Place and in the context of this library refers to + the distance between two adjacent floating point numbers. IEEE floating point + numbers can only represent a finite subset of natural numbers, with greater + accuracy for smaller numbers and lower accuracy for very large numbers. + + + If a comparison is allowed "2 ulps" of deviation, that means the values are + allowed to deviate by up to 2 adjacent floating point values, which might be + as low as 0.0000001 for small numbers or as high as 10.0 for large numbers. + + + + + Compares two floating point values for equality + First floating point value to be compared + Second floating point value t be compared + + Maximum number of representable floating point values that are allowed to + be between the left and the right floating point values + + True if both numbers are equal or close to being equal + + + Floating point values can only represent a finite subset of natural numbers. + For example, the values 2.00000000 and 2.00000024 can be stored in a float, + but nothing inbetween them. + + + This comparison will count how many possible floating point values are between + the left and the right number. If the number of possible values between both + numbers is less than or equal to maxUlps, then the numbers are considered as + being equal. + + + Implementation partially follows the code outlined here: + http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ + + + + + Compares two double precision floating point values for equality + First double precision floating point value to be compared + Second double precision floating point value t be compared + + Maximum number of representable double precision floating point values that are + allowed to be between the left and the right double precision floating point values + + True if both numbers are equal or close to being equal + + + Double precision floating point values can only represent a limited series of + natural numbers. For example, the values 2.0000000000000000 and 2.0000000000000004 + can be stored in a double, but nothing inbetween them. + + + This comparison will count how many possible double precision floating point + values are between the left and the right number. If the number of possible + values between both numbers is less than or equal to maxUlps, then the numbers + are considered as being equal. + + + Implementation partially follows the code outlined here: + http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ + + + + + + Reinterprets the memory contents of a floating point value as an integer value + + + Floating point value whose memory contents to reinterpret + + + The memory contents of the floating point value interpreted as an integer + + + + + Reinterprets the memory contents of a double precision floating point + value as an integer value + + + Double precision floating point value whose memory contents to reinterpret + + + The memory contents of the double precision floating point value + interpreted as an integer + + + + + Reinterprets the memory contents of an integer as a floating point value + + Integer value whose memory contents to reinterpret + + The memory contents of the integer value interpreted as a floating point value + + + + + Reinterprets the memory contents of an integer value as a double precision + floating point value + + Integer whose memory contents to reinterpret + + The memory contents of the integer interpreted as a double precision + floating point value + + + + Union of a floating point variable and an integer + + + The union's value as a floating point variable + + + The union's value as an integer + + + The union's value as an unsigned integer + + + Union of a double precision floating point variable and a long + + + The union's value as a double precision floating point variable + + + The union's value as a long + + + The union's value as an unsigned long + + + + MessageWriter is the abstract base for classes that write + constraint descriptions and messages in some form. The + class has separate methods for writing various components + of a message, allowing implementations to tailor the + presentation as needed. + + + + + Construct a MessageWriter given a culture + + + + + Method to write single line message with optional args, usually + written to precede the general failure message. + + The message to be written + Any arguments used in formatting the message + + + + Method to write single line message with optional args, usually + written to precede the general failure message, at a givel + indentation level. + + The indentation level of the message + The message to be written + Any arguments used in formatting the message + + + + Display Expected and Actual lines for a constraint. This + is called by MessageWriter's default implementation of + WriteMessageTo and provides the generic two-line display. + + The constraint that failed + + + + Display Expected and Actual lines for given values. This + method may be called by constraints that need more control over + the display of actual and expected values than is provided + by the default implementation. + + The expected value + The actual value causing the failure + + + + Display Expected and Actual lines for given values, including + a tolerance value on the Expected line. + + The expected value + The actual value causing the failure + The tolerance within which the test was made + + + + Display the expected and actual string values on separate lines. + If the mismatch parameter is >=0, an additional line is displayed + line containing a caret that points to the mismatch point. + + The expected string value + The actual string value + The point at which the strings don't match or -1 + If true, case is ignored in locating the point where the strings differ + If true, the strings should be clipped to fit the line + + + + Writes the text for a connector. + + The connector. + + + + Writes the text for a predicate. + + The predicate. + + + + Writes the text for an expected value. + + The expected value. + + + + Writes the text for a modifier + + The modifier. + + + + Writes the text for an actual value. + + The actual value. + + + + Writes the text for a generalized value. + + The value. + + + + Writes the text for a collection value, + starting at a particular point, to a max length + + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write + + + + Abstract method to get the max line length + + + + + Static methods used in creating messages + + + + + Static string used when strings are clipped + + + + + Returns the representation of a type as used in NUnitLite. + This is the same as Type.ToString() except for arrays, + which are displayed with their declared sizes. + + + + + + + Converts any control characters in a string + to their escaped representation. + + The string to be converted + The converted string + + + + Return the a string representation for a set of indices into an array + + Array of indices for which a string is needed + + + + Get an array of indices representing the point in a collection or + array corresponding to a single int index into the collection. + + The collection to which the indices apply + Index in the collection + Array of indices + + + + Clip a string to a given length, starting at a particular offset, returning the clipped + string with ellipses representing the removed parts + + The string to be clipped + The maximum permitted length of the result string + The point at which to start clipping + The clipped string + + + + Clip the expected and actual strings in a coordinated fashion, + so that they may be displayed together. + + + + + + + + + Shows the position two strings start to differ. Comparison + starts at the start index. + + The expected string + The actual string + The index in the strings at which comparison should start + Boolean indicating whether case should be ignored + -1 if no mismatch found, or the index where mismatch found + + + + The Numerics class contains common operations on numeric values. + + + + + Checks the type of the object, returning true if + the object is a numeric type. + + The object to check + true if the object is a numeric type + + + + Checks the type of the object, returning true if + the object is a floating point numeric type. + + The object to check + true if the object is a floating point numeric type + + + + Checks the type of the object, returning true if + the object is a fixed point numeric type. + + The object to check + true if the object is a fixed point numeric type + + + + Test two numeric values for equality, performing the usual numeric + conversions and using a provided or default tolerance. If the tolerance + provided is Empty, this method may set it to a default tolerance. + + The expected value + The actual value + A reference to the tolerance in effect + True if the values are equal + + + + Compare two numeric values, performing the usual numeric conversions. + + The expected value + The actual value + The relationship of the values to each other + + + + NUnitComparer encapsulates NUnit's default behavior + in comparing two objects. + + + + + Compares two objects + + + + + + + + Returns the default NUnitComparer. + + + + + NUnitEqualityComparer encapsulates NUnit's handling of + equality tests between objects. + + + + + If true, all string comparisons will ignore case + + + + + If true, arrays will be treated as collections, allowing + those of different dimensions to be compared + + + + + If non-zero, equality comparisons within the specified + tolerance will succeed. + + + + + Comparison object used in comparisons for some constraints. + + + + + Compares two objects for equality. + + + + + Helper method to compare two arrays + + + + + Method to compare two DirectoryInfo objects + + first directory to compare + second directory to compare + true if equivalent, false if not + + + + Returns the default NUnitEqualityComparer + + + + + Gets and sets a flag indicating whether case should + be ignored in determining equality. + + + + + Gets and sets a flag indicating that arrays should be + compared as collections, without regard to their shape. + + + + + Gets and sets an external comparer to be used to + test for equality. It is applied to members of + collections, in place of NUnit's own logic. + + + + + Gets and sets a tolerance used to compare objects of + certin types. + + + + + Gets the list of failure points for the last Match performed. + + + + + PathConstraint serves as the abstract base of constraints + that operate on paths and provides several helper methods. + + + + + The expected path used in the constraint + + + + + The actual path being tested + + + + + Flag indicating whether a caseInsensitive comparison should be made + + + + + Construct a PathConstraint for a give expected path + + The expected path + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Returns true if the expected path and actual path match + + + + + Returns the string representation of this constraint + + + + + Canonicalize the provided path + + + The path in standardized form + + + + Test whether two paths are the same + + The first path + The second path + Indicates whether case should be ignored + + + + + Test whether one path is under another path + + The first path - supposed to be the parent path + The second path - supposed to be the child path + Indicates whether case should be ignored + + + + + Test whether one path is the same as or under another path + + The first path - supposed to be the parent path + The second path - supposed to be the child path + + + + + Modifies the current instance to be case-insensitve + and returns it. + + + + + Modifies the current instance to be case-sensitve + and returns it. + + + + + Summary description for SamePathConstraint. + + + + + Initializes a new instance of the class. + + The expected path + + + + Test whether the constraint is satisfied by a given value + + The expected path + The actual path + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + SubPathConstraint tests that the actual path is under the expected path + + + + + Initializes a new instance of the class. + + The expected path + + + + Test whether the constraint is satisfied by a given value + + The expected path + The actual path + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + SamePathOrUnderConstraint tests that one path is under another + + + + + Initializes a new instance of the class. + + The expected path + + + + Test whether the constraint is satisfied by a given value + + The expected path + The actual path + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Predicate constraint wraps a Predicate in a constraint, + returning success if the predicate is true. + + + + + Construct a PredicateConstraint from a predicate + + + + + Determines whether the predicate succeeds when applied + to the actual value. + + + + + Writes the description to a MessageWriter + + + + + NotConstraint negates the effect of some other constraint + + + + + Initializes a new instance of the class. + + The base constraint to be negated. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for if the base constraint fails, false if it succeeds + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a MessageWriter. + + The writer on which the actual value is displayed + + + + AllItemsConstraint applies another constraint to each + item in a collection, succeeding if they all succeed. + + + + + Construct an AllItemsConstraint on top of an existing constraint + + + + + + Apply the item constraint to each item in the collection, + failing if any item fails. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + SomeItemsConstraint applies another constraint to each + item in a collection, succeeding if any of them succeeds. + + + + + Construct a SomeItemsConstraint on top of an existing constraint + + + + + + Apply the item constraint to each item in the collection, + succeeding if any item succeeds. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + NoItemConstraint applies another constraint to each + item in a collection, failing if any of them succeeds. + + + + + Construct a SomeItemsConstraint on top of an existing constraint + + + + + + Apply the item constraint to each item in the collection, + failing if any item fails. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + PropertyExistsConstraint tests that a named property + exists on the object provided through Match. + + Originally, PropertyConstraint provided this feature + in addition to making optional tests on the vaue + of the property. The two constraints are now separate. + + + + + Initializes a new instance of the class. + + The name of the property. + + + + Test whether the property exists for a given object + + The object to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. + + The writer on which the actual value is displayed + + + + Returns the string representation of the constraint. + + + + + + PropertyConstraint extracts a named property and uses + its value as the actual value for a chained constraint. + + + + + Initializes a new instance of the class. + + The name. + The constraint to apply to the property. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + Returns the string representation of the constraint. + + + + + + RangeConstraint tests whethe two values are within a + specified range. + + + + + Initializes a new instance of the class. + + From. + To. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Modifies the constraint to use an IComparer and returns self. + + + + + Modifies the constraint to use an IComparer<T> and returns self. + + + + + Modifies the constraint to use a Comparison<T> and returns self. + + + + + ResolvableConstraintExpression is used to represent a compound + constraint being constructed at a point where the last operator + may either terminate the expression or may have additional + qualifying constraints added to it. + + It is used, for example, for a Property element or for + an Exception element, either of which may be optionally + followed by constraints that apply to the property or + exception. + + + + + Create a new instance of ResolvableConstraintExpression + + + + + Create a new instance of ResolvableConstraintExpression, + passing in a pre-populated ConstraintBuilder. + + + + + Resolve the current expression to a Constraint + + + + + Appends an And Operator to the expression + + + + + Appends an Or operator to the expression. + + + + + ReusableConstraint wraps a resolved constraint so that it + may be saved and reused as needed. + + + + + Construct a ReusableConstraint + + The constraint or expression to be reused + + + + Conversion operator from a normal constraint to a ReusableConstraint. + + The original constraint to be wrapped as a ReusableConstraint + + + + + Returns the string representation of the constraint. + + A string representing the constraint + + + + Resolves the ReusableConstraint by returning the constraint + that it originally wrapped. + + A resolved constraint + + + + SameAsConstraint tests whether an object is identical to + the object passed to its constructor + + + + + Initializes a new instance of the class. + + The expected object. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + BinarySerializableConstraint tests whether + an object is serializable in binary format. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + Returns the string representation + + + + + BinarySerializableConstraint tests whether + an object is serializable in binary format. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + Returns the string representation of this constraint + + + + + StringConstraint is the abstract base for constraints + that operate on strings. It supports the IgnoreCase + modifier for string operations. + + + + + The expected value + + + + + Indicates whether tests should be case-insensitive + + + + + Constructs a StringConstraint given an expected value + + The expected value + + + + Modify the constraint to ignore case in matching. + + + + + EmptyStringConstraint tests whether a string is empty. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + NullEmptyStringConstraint tests whether a string is either null or empty. + + + + + Constructs a new NullOrEmptyStringConstraint + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + SubstringConstraint can test whether a string contains + the expected substring. + + + + + Initializes a new instance of the class. + + The expected. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + StartsWithConstraint can test whether a string starts + with an expected substring. + + + + + Initializes a new instance of the class. + + The expected string + + + + Test whether the constraint is matched by the actual value. + This is a template method, which calls the IsMatch method + of the derived class. + + + + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + EndsWithConstraint can test whether a string ends + with an expected substring. + + + + + Initializes a new instance of the class. + + The expected string + + + + Test whether the constraint is matched by the actual value. + This is a template method, which calls the IsMatch method + of the derived class. + + + + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + RegexConstraint can test whether a string matches + the pattern provided. + + + + + Initializes a new instance of the class. + + The pattern. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + ThrowsConstraint is used to test the exception thrown by + a delegate by applying a constraint to it. + + + + + Initializes a new instance of the class, + using a constraint to be applied to the exception. + + A constraint to apply to the caught exception. + + + + Executes the code of the delegate and captures any exception. + If a non-null base constraint was provided, it applies that + constraint to the exception. + + A delegate representing the code to be tested + True if an exception is thrown and the constraint succeeds, otherwise false + + + + Converts an ActualValueDelegate to a TestDelegate + before calling the primary overload. + + + + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + Returns the string representation of this constraint + + + + + Get the actual exception thrown - used by Assert.Throws. + + + + + ThrowsNothingConstraint tests that a delegate does not + throw an exception. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True if no exception is thrown, otherwise false + + + + Converts an ActualValueDelegate to a TestDelegate + before calling the primary overload. + + + + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + Modes in which the tolerance value for a comparison can + be interpreted. + + + + + The tolerance was created with a value, without specifying + how the value would be used. This is used to prevent setting + the mode more than once and is generally changed to Linear + upon execution of the test. + + + + + The tolerance is used as a numeric range within which + two compared values are considered to be equal. + + + + + Interprets the tolerance as the percentage by which + the two compared values my deviate from each other. + + + + + Compares two values based in their distance in + representable numbers. + + + + + The Tolerance class generalizes the notion of a tolerance + within which an equality test succeeds. Normally, it is + used with numeric types, but it can be used with any + type that supports taking a difference between two + objects and comparing that difference to a value. + + + + + Constructs a linear tolerance of a specdified amount + + + + + Constructs a tolerance given an amount and ToleranceMode + + + + + Tests that the current Tolerance is linear with a + numeric value, throwing an exception if it is not. + + + + + Returns an empty Tolerance object, equivalent to + specifying an exact match. + + + + + Gets the ToleranceMode for the current Tolerance + + + + + Gets the value of the current Tolerance instance. + + + + + Returns a new tolerance, using the current amount as a percentage. + + + + + Returns a new tolerance, using the current amount in Ulps. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of days. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of hours. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of minutes. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of seconds. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of milliseconds. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of clock ticks. + + + + + Returns true if the current tolerance is empty. + + + + + TypeConstraint is the abstract base for constraints + that take a Type as their expected value. + + + + + The expected Type used by the constraint + + + + + Construct a TypeConstraint for a given Type + + + + + + Write the actual value for a failing constraint test to a + MessageWriter. TypeConstraints override this method to write + the name of the type. + + The writer on which the actual value is displayed + + + + ExactTypeConstraint is used to test that an object + is of the exact type provided in the constructor + + + + + Construct an ExactTypeConstraint for a given Type + + The expected Type. + + + + Test that an object is of the exact type specified + + The actual value. + True if the tested object is of the exact type provided, otherwise false. + + + + Write the description of this constraint to a MessageWriter + + The MessageWriter to use + + + + InstanceOfTypeConstraint is used to test that an object + is of the same type provided or derived from it. + + + + + Construct an InstanceOfTypeConstraint for the type provided + + The expected Type + + + + Test whether an object is of the specified type or a derived type + + The object to be tested + True if the object is of the provided type or derives from it, otherwise false. + + + + Write a description of this constraint to a MessageWriter + + The MessageWriter to use + + + + AssignableFromConstraint is used to test that an object + can be assigned from a given Type. + + + + + Construct an AssignableFromConstraint for the type provided + + + + + + Test whether an object can be assigned from the specified type + + The object to be tested + True if the object can be assigned a value of the expected Type, otherwise false. + + + + Write a description of this constraint to a MessageWriter + + The MessageWriter to use + + + + AssignableToConstraint is used to test that an object + can be assigned to a given Type. + + + + + Construct an AssignableToConstraint for the type provided + + + + + + Test whether an object can be assigned to the specified type + + The object to be tested + True if the object can be assigned a value of the expected Type, otherwise false. + + + + Write a description of this constraint to a MessageWriter + + The MessageWriter to use + + + + Thrown when an assertion failed. + + + + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Thrown when an assertion failed. + + + + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Thrown when a test executes inconclusively. + + + + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Thrown when an assertion failed. + + + + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Delegate used by tests that execute code and + capture any thrown exception. + + + + + The Assert class contains a collection of static methods that + implement the most common assertions used in NUnit. + + + + + We don't actually want any instances of this object, but some people + like to inherit from it to add other static methods. Hence, the + protected constructor disallows any instances of this object. + + + + + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + Helper for Assert.AreEqual(double expected, double actual, ...) + allowing code generation to work consistently. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + + The message to initialize the with. + + + + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + + + + + Throws an with the message and arguments + that are passed in. This is used by the other Assert functions. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws an with the message that is + passed in. This is used by the other Assert functions. + + The message to initialize the with. + + + + Throws an . + This is used by the other Assert functions. + + + + + Throws an with the message and arguments + that are passed in. This causes the test to be reported as ignored. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws an with the message that is + passed in. This causes the test to be reported as ignored. + + The message to initialize the with. + + + + Throws an . + This causes the test to be reported as ignored. + + + + + Throws an with the message and arguments + that are passed in. This causes the test to be reported as inconclusive. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws an with the message that is + passed in. This causes the test to be reported as inconclusive. + + The message to initialize the with. + + + + Throws an . + This causes the test to be reported as Inconclusive. + + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint to be applied + The actual value to test + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint to be applied + The actual value to test + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint to be applied + The actual value to test + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint to be applied + The actual value to test + The message that will be displayed on failure + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display if the condition is false + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + + + + Verifies that a delegate throws a particular exception when called. + + A constraint to be satisfied by the exception + A TestSnippet delegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. + + A constraint to be satisfied by the exception + A TestSnippet delegate + The message that will be displayed on failure + + + + Verifies that a delegate throws a particular exception when called. + + A constraint to be satisfied by the exception + A TestSnippet delegate + + + + Verifies that a delegate throws a particular exception when called. + + The exception Type expected + A TestSnippet delegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. + + The exception Type expected + A TestSnippet delegate + The message that will be displayed on failure + + + + Verifies that a delegate throws a particular exception when called. + + The exception Type expected + A TestSnippet delegate + + + + Verifies that a delegate throws a particular exception when called. + + Type of the expected exception + A TestSnippet delegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. + + Type of the expected exception + A TestSnippet delegate + The message that will be displayed on failure + + + + Verifies that a delegate throws a particular exception when called. + + Type of the expected exception + A TestSnippet delegate + + + + Verifies that a delegate throws an exception when called + and returns it. + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception when called + and returns it. + + A TestDelegate + The message that will be displayed on failure + + + + Verifies that a delegate throws an exception when called + and returns it. + + A TestDelegate + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + + + + Verifies that a delegate does not throw an exception + + A TestSnippet delegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate does not throw an exception. + + A TestSnippet delegate + The message that will be displayed on failure + + + + Verifies that a delegate does not throw an exception. + + A TestSnippet delegate + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + The message to display in case of failure + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + The message to display in case of failure + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + + + + Assert that a string is empty - that is equal to string.Empty + + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that a string is empty - that is equal to string.Empty + + The string to be tested + The message to display in case of failure + + + + Assert that a string is empty - that is equal to string.Empty + + The string to be tested + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing ICollection + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing ICollection + The message to display in case of failure + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing ICollection + + + + Assert that a string is not empty - that is not equal to string.Empty + + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that a string is not empty - that is not equal to string.Empty + + The string to be tested + The message to display in case of failure + + + + Assert that a string is not empty - that is not equal to string.Empty + + The string to be tested + + + + Assert that an array, list or other collection is not empty + + An array, list or other collection implementing ICollection + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that an array, list or other collection is not empty + + An array, list or other collection implementing ICollection + The message to display in case of failure + + + + Assert that an array, list or other collection is not empty + + An array, list or other collection implementing ICollection + + + + Assert that a string is either null or equal to string.Empty + + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that a string is either null or equal to string.Empty + + The string to be tested + The message to display in case of failure + + + + Assert that a string is either null or equal to string.Empty + + The string to be tested + + + + Assert that a string is not null or empty + + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that a string is not null or empty + + The string to be tested + The message to display in case of failure + + + + Assert that a string is not null or empty + + The string to be tested + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + + + + Verifies that two objects are equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are not equal an is thrown. + + The value that is expected + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two objects are equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are not equal an is thrown. + + The value that is expected + The actual value + The message to display in case of failure + + + + Verifies that two objects are equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are not equal an is thrown. + + The value that is expected + The actual value + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two objects are not equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are equal an is thrown. + + The value that is expected + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two objects are not equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are equal an is thrown. + + The value that is expected + The actual value + The message to display in case of failure + + + + Verifies that two objects are not equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are equal an is thrown. + + The value that is expected + The actual value + + + + Asserts that two objects refer to the same object. If they + are not the same an is thrown. + + The expected object + The actual object + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that two objects refer to the same object. If they + are not the same an is thrown. + + The expected object + The actual object + The message to display in case of failure + + + + Asserts that two objects refer to the same object. If they + are not the same an is thrown. + + The expected object + The actual object + + + + Asserts that two objects do not refer to the same object. If they + are the same an is thrown. + + The expected object + The actual object + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that two objects do not refer to the same object. If they + are the same an is thrown. + + The expected object + The actual object + The message to display in case of failure + + + + Asserts that two objects do not refer to the same object. If they + are the same an is thrown. + + The expected object + The actual object + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Asserts that an object is contained in a list. + + The expected object + The list to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is contained in a list. + + The expected object + The list to be examined + The message to display in case of failure + + + + Asserts that an object is contained in a list. + + The expected object + The list to be examined + + + + Gets the number of assertions executed so far and + resets the counter to zero. + + + + + AssertionHelper is an optional base class for user tests, + allowing the use of shorter names for constraints and + asserts and avoiding conflict with the definition of + , from which it inherits much of its + behavior, in certain mock object frameworks. + + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. Works + identically to + + A Constraint to be applied + The actual value to test + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. Works + identically to + + A Constraint to be applied + The actual value to test + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. Works + identically to + + A Constraint to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint to be applied + The actual value to test + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint to be applied + The actual value to test + The message that will be displayed on failure + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically to + . + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically to + . + + The evaluated condition + The message to display if the condition is false + + + + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically to . + + The evaluated condition + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + + + + Returns a ListMapper based on a collection. + + The original collection + + + + + Provides static methods to express the assumptions + that must be met for a test to give a meaningful + result. If an assumption is not met, the test + should produce an inconclusive result. + + + + + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + The actual value to test + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + The actual value to test + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display if the condition is false + + + + Asserts that a condition is true. If the condition is false the + method throws an . + + The evaluated condition + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + + + + A set of Assert methods operationg on one or more collections + + + + + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + Asserts that all items contained in collection are of the type specified by expectedType. + + IEnumerable containing objects to be considered + System.Type that all objects in collection must be instances of + + + + Asserts that all items contained in collection are of the type specified by expectedType. + + IEnumerable containing objects to be considered + System.Type that all objects in collection must be instances of + The message that will be displayed on failure + + + + Asserts that all items contained in collection are of the type specified by expectedType. + + IEnumerable containing objects to be considered + System.Type that all objects in collection must be instances of + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that all items contained in collection are not equal to null. + + IEnumerable containing objects to be considered + + + + Asserts that all items contained in collection are not equal to null. + + IEnumerable containing objects to be considered + The message that will be displayed on failure + + + + Asserts that all items contained in collection are not equal to null. + + IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Ensures that every object contained in collection exists within the collection + once and only once. + + IEnumerable of objects to be considered + + + + Ensures that every object contained in collection exists within the collection + once and only once. + + IEnumerable of objects to be considered + The message that will be displayed on failure + + + + Ensures that every object contained in collection exists within the collection + once and only once. + + IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + + + + Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are not exactly equal. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are not exactly equal. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + + + + Asserts that expected and actual are not exactly equal. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + + + + Asserts that expected and actual are not exactly equal. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure + + + + Asserts that expected and actual are not exactly equal. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are not exactly equal. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are not equivalent. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are not equivalent. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + + + + Asserts that expected and actual are not equivalent. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that collection contains actual as an item. + + IEnumerable of objects to be considered + Object to be found within collection + + + + Asserts that collection contains actual as an item. + + IEnumerable of objects to be considered + Object to be found within collection + The message that will be displayed on failure + + + + Asserts that collection contains actual as an item. + + IEnumerable of objects to be considered + Object to be found within collection + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that collection does not contain actual as an item. + + IEnumerable of objects to be considered + Object that cannot exist within collection + + + + Asserts that collection does not contain actual as an item. + + IEnumerable of objects to be considered + Object that cannot exist within collection + The message that will be displayed on failure + + + + Asserts that collection does not contain actual as an item. + + IEnumerable of objects to be considered + Object that cannot exist within collection + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that superset is not a subject of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + + + + Asserts that superset is not a subject of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + + + + Asserts that superset is not a subject of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that superset is a subset of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + + + + Asserts that superset is a subset of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + + + + Asserts that superset is a subset of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + + + + Assert that an array,list or other collection is empty + + An array, list or other collection implementing IEnumerable + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + + + + Assert that an array,list or other collection is empty + + An array, list or other collection implementing IEnumerable + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + A custom comparer to perform the comparisons + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + A custom comparer to perform the comparisons + The message to be displayed on failure + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + A custom comparer to perform the comparisons + + + + Static helper class used in the constraint-based syntax + + + + + Creates a new SubstringConstraint + + The value of the substring + A SubstringConstraint + + + + Creates a new CollectionContainsConstraint. + + The item that should be found. + A new CollectionContainsConstraint + + + + Summary description for DirectoryAssert + + + + + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + We don't actually want any instances of this object, but some people + like to inherit from it to add other static methods. Hence, the + protected constructor disallows any instances of this object. + + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + The message to display if directories are not equal + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + The message to display if directories are equal + Arguments to be used in formatting the message + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + The message to display if directories are equal + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + The message to display if directories are not equal + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + The message to display if directories are not equal + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + The message to display if directories are not equal + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + The message to display if directories are not equal + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + Arguments to be used in formatting the message + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + Arguments to be used in formatting the message + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + Arguments to be used in formatting the message + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + Arguments to be used in formatting the message + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + + + + Summary description for FileAssert. + + + + + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + We don't actually want any instances of this object, but some people + like to inherit from it to add other static methods. Hence, the + protected constructor disallows any instances of this object. + + + + + Verifies that two Streams are equal. Two Streams are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The expected Stream + The actual Stream + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Verifies that two Streams are equal. Two Streams are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The expected Stream + The actual Stream + The message to display if objects are not equal + + + + Verifies that two Streams are equal. Two Streams are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The expected Stream + The actual Stream + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A file containing the value that is expected + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A file containing the value that is expected + A file containing the actual value + The message to display if objects are not equal + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A file containing the value that is expected + A file containing the actual value + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if objects are not equal + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + + + + Asserts that two Streams are not equal. If they are equal + an is thrown. + + The expected Stream + The actual Stream + The message to be displayed when the two Stream are the same. + Arguments to be used in formatting the message + + + + Asserts that two Streams are not equal. If they are equal + an is thrown. + + The expected Stream + The actual Stream + The message to be displayed when the Streams are the same. + + + + Asserts that two Streams are not equal. If they are equal + an is thrown. + + The expected Stream + The actual Stream + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + A file containing the value that is expected + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + A file containing the value that is expected + A file containing the actual value + The message to display if objects are not equal + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + A file containing the value that is expected + A file containing the actual value + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if objects are not equal + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + + + + GlobalSettings is a place for setting default values used + by the framework in performing asserts. + + + + + Default tolerance for floating point equality + + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. + + + + + Interface implemented by a user fixture in order to + validate any expected exceptions. It is only called + for test methods marked with the ExpectedException + attribute. + + + + + Method to handle an expected exception + + The exception to be handled + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a constraint that tests two items for equality + + + + + Returns a constraint that tests that two references are the same object + + + + + Returns a constraint that tests whether the + actual value is greater than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the Regex pattern supplied as an argument. + + + + + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the actual value falls + within a specified range. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a constraint that tests for null + + + + + Returns a constraint that tests for True + + + + + Returns a constraint that tests for False + + + + + Returns a constraint that tests for NaN + + + + + Returns a constraint that tests for empty + + + + + Returns a constraint that tests whether a collection + contains all unique items. + + + + + Returns a constraint that tests whether an object graph is serializable in binary format. + + + + + Returns a constraint that tests whether an object graph is serializable in xml format. + + + + + Returns a constraint that tests whether a collection is ordered + + + + + The Iz class is a synonym for Is intended for use in VB, + which regards Is as a keyword. + + + + + The List class is a helper class with properties and methods + that supply a number of constraints used with lists and collections. + + + + + List.Map returns a ListMapper, which can be used to map + the original collection to another collection. + + + + + + + ListMapper is used to transform a collection used as an actual argument + producing another collection to be used in the assertion. + + + + + Construct a ListMapper based on a collection + + The collection to be transformed + + + + Produces a collection containing all the values of a property + + The collection of property values + + + + + Randomizer returns a set of random values in a repeatable + way, to allow re-running of tests if necessary. + + + + + Get a randomizer for a particular member, returning + one that has already been created if it exists. + This ensures that the same values are generated + each time the tests are reloaded. + + + + + Get a randomizer for a particular parameter, returning + one that has already been created if it exists. + This ensures that the same values are generated + each time the tests are reloaded. + + + + + Construct a randomizer using a random seed + + + + + Construct a randomizer using a specified seed + + + + + Return an array of random doubles between 0.0 and 1.0. + + + + + + + Return an array of random doubles with values in a specified range. + + + + + Return an array of random ints with values in a specified range. + + + + + Get a random seed for use in creating a randomizer. + + + + + The SpecialValue enum is used to represent TestCase arguments + that cannot be used as arguments to an Attribute. + + + + + Null represents a null value, which cannot be used as an + argument to an attriute under .NET 1.x + + + + + Basic Asserts on strings. + + + + + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + The message to display in case of failure + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + + + + Asserts that a string is not found within another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + The message to display in case of failure + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + + + + Asserts that a string starts with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string starts with another string. + + The expected string + The string to be examined + The message to display in case of failure + + + + Asserts that a string starts with another string. + + The expected string + The string to be examined + + + + Asserts that a string does not start with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string does not start with another string. + + The expected string + The string to be examined + The message to display in case of failure + + + + Asserts that a string does not start with another string. + + The expected string + The string to be examined + + + + Asserts that a string ends with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string ends with another string. + + The expected string + The string to be examined + The message to display in case of failure + + + + Asserts that a string ends with another string. + + The expected string + The string to be examined + + + + Asserts that a string does not end with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string does not end with another string. + + The expected string + The string to be examined + The message to display in case of failure + + + + Asserts that a string does not end with another string. + + The expected string + The string to be examined + + + + Asserts that two strings are equal, without regard to case. + + The expected string + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that two strings are equal, without regard to case. + + The expected string + The actual string + The message to display in case of failure + + + + Asserts that two strings are equal, without regard to case. + + The expected string + The actual string + + + + Asserts that two strings are not equal, without regard to case. + + The expected string + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that two strings are Notequal, without regard to case. + + The expected string + The actual string + The message to display in case of failure + + + + Asserts that two strings are not equal, without regard to case. + + The expected string + The actual string + + + + Asserts that a string matches an expected regular expression pattern. + + The regex pattern to be matched + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string matches an expected regular expression pattern. + + The regex pattern to be matched + The actual string + The message to display in case of failure + + + + Asserts that a string matches an expected regular expression pattern. + + The regex pattern to be matched + The actual string + + + + Asserts that a string does not match an expected regular expression pattern. + + The regex pattern to be used + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string does not match an expected regular expression pattern. + + The regex pattern to be used + The actual string + The message to display in case of failure + + + + Asserts that a string does not match an expected regular expression pattern. + + The regex pattern to be used + The actual string + + + + The TestCaseData class represents a set of arguments + and other parameter info to be used for a parameterized + test case. It provides a number of instance modifiers + for use in initializing the test case. + + Note: Instance modifiers are getters that return + the same instance after modifying it's state. + + + + + The argument list to be provided to the test + + + + + The expected result to be returned + + + + + The expected exception Type + + + + + The FullName of the expected exception + + + + + The name to be used for the test + + + + + The description of the test + + + + + A dictionary of properties, used to add information + to tests without requiring the class to change. + + + + + If true, indicates that the test case is to be ignored + + + + + The reason for ignoring a test case + + + + + Initializes a new instance of the class. + + The arguments. + + + + Initializes a new instance of the class. + + The argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + The third argument. + + + + Sets the expected result for the test + + The expected result + A modified TestCaseData + + + + Sets the expected exception type for the test + + Type of the expected exception. + The modified TestCaseData instance + + + + Sets the expected exception type for the test + + FullName of the expected exception. + The modified TestCaseData instance + + + + Sets the name of the test case + + The modified TestCaseData instance + + + + Sets the description for the test case + being constructed. + + The description. + The modified TestCaseData instance. + + + + Applies a category to the test + + + + + + + Applies a named property to the test + + + + + + + + Applies a named property to the test + + + + + + + + Applies a named property to the test + + + + + + + + Ignores this TestCase. + + + + + + Ignores this TestCase, specifying the reason. + + The reason. + + + + + Gets the argument list to be provided to the test + + + + + Gets the expected result + + + + + Gets the expected exception Type + + + + + Gets the FullName of the expected exception + + + + + Gets the name to be used for the test + + + + + Gets the description of the test + + + + + Gets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets the ignore reason. + + The ignore reason. + + + + Gets a list of categories associated with this test. + + + + + Gets the property dictionary for this test + + + + + Provide the context information of the current test + + + + + Constructs a TestContext using the provided context dictionary + + A context dictionary + + + + Get the current test context. This is created + as needed. The user may save the context for + use within a test, but it should not be used + outside the test for which it is created. + + + + + Gets a TestAdapter representing the currently executing test in this context. + + + + + Gets a ResultAdapter representing the current result for the test + executing in this context. + + + + + Gets the current directory for this TestContext + + + + + TestAdapter adapts a Test for consumption by + the user test code. + + + + + Constructs a TestAdapter for this context + + The context dictionary + + + + The name of the test. + + + + + The FullName of the test + + + + + The properties of the test. + + + + + ResultAdapter adapts a TestResult for consumption by + the user test code. + + + + + Construct a ResultAdapter for a context + + The context holding the result + + + + The TestState of current test. This maps to the ResultState + used in nunit.core and is subject to change in the future. + + + + + The TestStatus of current test. This enum will be used + in future versions of NUnit and so is to be preferred + to the TestState value. + + + + + The ResultState enum indicates the result of running a test + + + + + The result is inconclusive + + + + + The test was not runnable. + + + + + The test has been skipped. + + + + + The test has been ignored. + + + + + The test succeeded + + + + + The test failed + + + + + The test encountered an unexpected exception + + + + + The test was cancelled by the user + + + + + The TestStatus enum indicates the result of running a test + + + + + The test was inconclusive + + + + + The test has skipped + + + + + The test succeeded + + + + + The test failed + + + + + Helper class with static methods used to supply constraints + that operate on strings. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the Regex pattern supplied as an argument. + + + + + Returns a constraint that fails if the actual + value matches the pattern supplied as an argument. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + TextMessageWriter writes constraint descriptions and messages + in displayable form as a text stream. It tailors the display + of individual message components to form the standard message + format of NUnit assertion failure messages. + + + + + Prefix used for the expected value line of a message + + + + + Prefix used for the actual value line of a message + + + + + Length of a message prefix + + + + + Construct a TextMessageWriter + + + + + Construct a TextMessageWriter, specifying a user message + and optional formatting arguments. + + + + + + + Method to write single line message with optional args, usually + written to precede the general failure message, at a givel + indentation level. + + The indentation level of the message + The message to be written + Any arguments used in formatting the message + + + + Display Expected and Actual lines for a constraint. This + is called by MessageWriter's default implementation of + WriteMessageTo and provides the generic two-line display. + + The constraint that failed + + + + Display Expected and Actual lines for given values. This + method may be called by constraints that need more control over + the display of actual and expected values than is provided + by the default implementation. + + The expected value + The actual value causing the failure + + + + Display Expected and Actual lines for given values, including + a tolerance value on the expected line. + + The expected value + The actual value causing the failure + The tolerance within which the test was made + + + + Display the expected and actual string values on separate lines. + If the mismatch parameter is >=0, an additional line is displayed + line containing a caret that points to the mismatch point. + + The expected string value + The actual string value + The point at which the strings don't match or -1 + If true, case is ignored in string comparisons + If true, clip the strings to fit the max line length + + + + Writes the text for a connector. + + The connector. + + + + Writes the text for a predicate. + + The predicate. + + + + Write the text for a modifier. + + The modifier. + + + + Writes the text for an expected value. + + The expected value. + + + + Writes the text for an actual value. + + The actual value. + + + + Writes the text for a generalized value. + + The value. + + + + Writes the text for a collection value, + starting at a particular point, to a max length + + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write + + + + Write the generic 'Expected' line for a constraint + + The constraint that failed + + + + Write the generic 'Expected' line for a given value + + The expected value + + + + Write the generic 'Expected' line for a given value + and tolerance. + + The expected value + The tolerance within which the test was made + + + + Write the generic 'Actual' line for a constraint + + The constraint for which the actual value is to be written + + + + Write the generic 'Actual' line for a given value + + The actual value causing a failure + + + + Gets or sets the maximum line length for this writer + + + + + Helper class with properties and methods that supply + constraints that operate on exceptions. + + + + + Creates a constraint specifying the exact type of exception expected + + + + + Creates a constraint specifying the exact type of exception expected + + + + + Creates a constraint specifying the type of exception expected + + + + + Creates a constraint specifying the type of exception expected + + + + + Creates a constraint specifying an expected exception + + + + + Creates a constraint specifying an exception with a given InnerException + + + + + Creates a constraint specifying an expected TargetInvocationException + + + + + Creates a constraint specifying an expected TargetInvocationException + + + + + Creates a constraint specifying an expected TargetInvocationException + + + + + Creates a constraint specifying that no exception is thrown + + + + diff --git a/packages/NUnit.2.5.9.10348/license.txt b/packages/NUnit.2.5.9.10348/license.txt new file mode 100644 index 00000000..66a5ebf2 --- /dev/null +++ b/packages/NUnit.2.5.9.10348/license.txt @@ -0,0 +1,15 @@ +Copyright © 2002-2008 Charlie Poole +Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov +Copyright © 2000-2002 Philip A. Craig + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product documentation is required. + +Portions Copyright © 2002-2008 Charlie Poole or Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov or Copyright © 2000-2002 Philip A. Craig + +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. diff --git a/packages/Simple.Data.Ado.0.6.1/Simple.Data.Ado.0.6.1.nuspec b/packages/Simple.Data.Ado.0.6.1/Simple.Data.Ado.0.6.1.nuspec new file mode 100644 index 00000000..02b01d29 --- /dev/null +++ b/packages/Simple.Data.Ado.0.6.1/Simple.Data.Ado.0.6.1.nuspec @@ -0,0 +1,20 @@ + + + + Simple.Data.Ado + 0.6.1 + Simple.Data.Ado + Mark Rendle + Mark Rendle + http://www.opensource.org/licenses/mit-license.php + http://github.com/markrendle/Simple.Data + http://simplefx.org/images/simpledata100x100.png + false + ADO Adapter for the Simple.Data data access library. + ADO Adapter for the Simple.Data data access library. + sqlserver database data ado .net40 + + + + + \ No newline at end of file diff --git a/packages/Simple.Data.Core.0.6.1/Simple.Data.Core.0.6.1.nuspec b/packages/Simple.Data.Core.0.6.1/Simple.Data.Core.0.6.1.nuspec new file mode 100644 index 00000000..95740846 --- /dev/null +++ b/packages/Simple.Data.Core.0.6.1/Simple.Data.Core.0.6.1.nuspec @@ -0,0 +1,17 @@ + + + + Simple.Data.Core + 0.6.1 + Simple.Data.Core + Mark Rendle + Mark Rendle + http://www.opensource.org/licenses/mit-license.php + http://github.com/markrendle/Simple.Data + http://simplefx.org/images/simpledata100x100.png + false + A Simple, Dynamic data access library. + A Simple, Dynamic data access library. + sql database data ado .net40 + + \ No newline at end of file diff --git a/packages/Simple.Data.SqlCompact40.0.6.1/Simple.Data.SqlCompact40.0.6.1.nuspec b/packages/Simple.Data.SqlCompact40.0.6.1/Simple.Data.SqlCompact40.0.6.1.nuspec new file mode 100644 index 00000000..4baedf2b --- /dev/null +++ b/packages/Simple.Data.SqlCompact40.0.6.1/Simple.Data.SqlCompact40.0.6.1.nuspec @@ -0,0 +1,20 @@ + + + + Simple.Data.SqlCompact40 + 0.6.1 + Simple.Data.SqlCompact40 + Mark Rendle + Mark Rendle + http://www.opensource.org/licenses/mit-license.php + http://github.com/markrendle/Simple.Data + http://simplefx.org/images/simpledata100x100.png + false + SQL Server Compact 4.0 ADO provider for the Simple.Data data access library. + SQL Server Compact 4.0 ADO provider for the Simple.Data data access library. + sqlserver compact sqlce database data ado .net40 + + + + + \ No newline at end of file diff --git a/packages/SqlServerCompact.4.0.8482.1/NativeBinaries/amd64/Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest b/packages/SqlServerCompact.4.0.8482.1/NativeBinaries/amd64/Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest new file mode 100644 index 00000000..47bd4a04 --- /dev/null +++ b/packages/SqlServerCompact.4.0.8482.1/NativeBinaries/amd64/Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest @@ -0,0 +1,6 @@ + + + + + Vy8CgQgbu3qH5JHTK0op4kR8114= QTJu3Gttpt8hhCktGelNeXj4Yp8= 1ruqF7/L+m1tqnJVscaOtNRNHIE= + \ No newline at end of file diff --git a/packages/SqlServerCompact.4.0.8482.1/NativeBinaries/amd64/Microsoft.VC90.CRT/README_ENU.txt b/packages/SqlServerCompact.4.0.8482.1/NativeBinaries/amd64/Microsoft.VC90.CRT/README_ENU.txt new file mode 100644 index 0000000000000000000000000000000000000000..fc38b3684fbe06e056c123e9ff6f576f842c8b69 GIT binary patch literal 406 zcma)&K?=e!6hvn&c!wT9ih?%~T)7dwK#Z*hVp`guw^wI=tHqt0<|l9dpZR?~kGP^j zff@mkRnI!2frmrp{mgqn;x|(njMwCmq(aAc$FC+NzGj{W?6I>`{64BSq&Kuwds9t* zCA9_Sm|;teCd#*?T3HQlnOqreI$l7`C9(|izJDrmx~ESXlT7=Tmf;N($w#&T literal 0 HcmV?d00001 diff --git a/packages/SqlServerCompact.4.0.8482.1/NativeBinaries/x86/Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest b/packages/SqlServerCompact.4.0.8482.1/NativeBinaries/x86/Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest new file mode 100644 index 00000000..bbd12ccd --- /dev/null +++ b/packages/SqlServerCompact.4.0.8482.1/NativeBinaries/x86/Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest @@ -0,0 +1,6 @@ + + + + + +CXED+6HzJlSphyMNOn27ujadC0= MyKED+9DyS+1XcMeaC0Zlw2vFZ0= EeyDE7og6WoPd2oBhYbMEnpFHhY= + \ No newline at end of file diff --git a/packages/SqlServerCompact.4.0.8482.1/NativeBinaries/x86/Microsoft.VC90.CRT/README_ENU.txt b/packages/SqlServerCompact.4.0.8482.1/NativeBinaries/x86/Microsoft.VC90.CRT/README_ENU.txt new file mode 100644 index 0000000000000000000000000000000000000000..fc38b3684fbe06e056c123e9ff6f576f842c8b69 GIT binary patch literal 406 zcma)&K?=e!6hvn&c!wT9ih?%~T)7dwK#Z*hVp`guw^wI=tHqt0<|l9dpZR?~kGP^j zff@mkRnI!2frmrp{mgqn;x|(njMwCmq(aAc$FC+NzGj{W?6I>`{64BSq&Kuwds9t* zCA9_Sm|;teCd#*?T3HQlnOqreI$l7`C9(|izJDrmx~ESXlT7=Tmf;N($w#&T literal 0 HcmV?d00001 diff --git a/packages/SqlServerCompact.4.0.8482.1/SqlServerCompact.4.0.8482.1.nuspec b/packages/SqlServerCompact.4.0.8482.1/SqlServerCompact.4.0.8482.1.nuspec new file mode 100644 index 00000000..6b95d06d --- /dev/null +++ b/packages/SqlServerCompact.4.0.8482.1/SqlServerCompact.4.0.8482.1.nuspec @@ -0,0 +1,14 @@ + + + + SqlServerCompact + 4.0.8482.1 + SqlServerCompact + Microsoft + Microsoft + http://www.microsoft.com/web/webpi/eula/SQLCE_EULA_ENU.rtf + true + SQL Server Compact. An embedded SQL database. + SQL Server Compact. An embedded SQL database. + + \ No newline at end of file diff --git a/packages/SqlServerCompact.4.0.8482.1/Tools/GetSqlCEPostBuildCmd.ps1 b/packages/SqlServerCompact.4.0.8482.1/Tools/GetSqlCEPostBuildCmd.ps1 index fc2509bf..849e8bc4 100644 --- a/packages/SqlServerCompact.4.0.8482.1/Tools/GetSqlCEPostBuildCmd.ps1 +++ b/packages/SqlServerCompact.4.0.8482.1/Tools/GetSqlCEPostBuildCmd.ps1 @@ -1,12 +1,12 @@ -$solutionDir = [System.IO.Path]::GetDirectoryName($dte.Solution.FullName) + "\" -$path = $installPath.Replace($solutionDir, "`$(SolutionDir)") - -$NativeAssembliesDir = Join-Path $path "NativeBinaries" -$x86 = $(Join-Path $NativeAssembliesDir "x86\*.dll") -$x64 = $(Join-Path $NativeAssembliesDir "amd64\*.dll") - -$SqlCEPostBuildCmd = " -if not exist `"`$(TargetDir)x86`" md `"`$(TargetDir)x86`" -copy `"$x86`" `"`$(TargetDir)x86`" -if not exist `"`$(TargetDir)amd64`" md `"`$(TargetDir)amd64`" -copy `"$x64`" `"`$(TargetDir)amd64" \ No newline at end of file +$solutionDir = [System.IO.Path]::GetDirectoryName($dte.Solution.FullName) + "\" +$path = $installPath.Replace($solutionDir, "`$(SolutionDir)") + +$NativeAssembliesDir = Join-Path $path "NativeBinaries" +$x86 = $(Join-Path $NativeAssembliesDir "x86\*.*") +$x64 = $(Join-Path $NativeAssembliesDir "amd64\*.*") + +$SqlCEPostBuildCmd = " +if not exist `"`$(TargetDir)x86`" md `"`$(TargetDir)x86`" +xcopy /s /y `"$x86`" `"`$(TargetDir)x86`" +if not exist `"`$(TargetDir)amd64`" md `"`$(TargetDir)amd64`" +xcopy /s /y `"$x64`" `"`$(TargetDir)amd64`"" \ No newline at end of file diff --git a/packages/Trespasser.1.1/Trespasser.1.1.nuspec b/packages/Trespasser.1.1/Trespasser.1.1.nuspec new file mode 100644 index 00000000..8c6d6e7e --- /dev/null +++ b/packages/Trespasser.1.1/Trespasser.1.1.nuspec @@ -0,0 +1,16 @@ + + + + Trespasser + 1.1 + Trespasser + Mark Rendle + Mark Rendle + http://www.opensource.org/licenses/mit-license.php + http://github.com/markrendle/trespasser + false + Private Proxy for testing + Private Proxy for testing + Test NUnit xUnit + + \ No newline at end of file From 8fd63e78d2d238e3e0bc3eead87ff1cf1bb3f67d Mon Sep 17 00:00:00 2001 From: Mark Rendle Date: Mon, 23 Sep 2013 17:10:53 +0100 Subject: [PATCH 02/15] Building, 434 tests failing --- .../AdoAdapter.IAdapterWithFunctions.cs | 2 +- .../AdoAdapter.IAdapterWithTransactions.cs | 307 ++++--- Simple.Data.Ado/AdoAdapter.cs | 779 ++++++++-------- Simple.Data.Ado/AdoAdapterRelatedFinder.cs | 160 ++-- Simple.Data.Ado/AdoAdapterUpserter.cs | 2 +- .../AdoOptimizingDelegateFactory.cs | 24 - Simple.Data.Ado/Simple.Data.Ado.csproj | 345 ++++--- Simple.Data.UnitTest/AdapterFactoryTest.cs | 179 ++-- ...BeginTransactionWithIsolataionLevelTest.cs | 181 ++-- Simple.Data.UnitTest/MethodNameParserTest.cs | 9 +- Simple.Data/Adapter.cs | 443 +++------ Simple.Data/CommandResult.cs | 17 + Simple.Data/Commands/DeleteAllCommand.cs | 17 +- Simple.Data/Commands/DeleteByCommand.cs | 87 +- .../Commands/ExecuteFunctionCommand.cs | 117 +-- Simple.Data/Commands/FindByCommand.cs | 158 ++-- Simple.Data/Commands/FindCommand.cs | 97 +- Simple.Data/Commands/GetCommand.cs | 98 +- Simple.Data/Commands/InsertCommand.cs | 184 ++-- Simple.Data/Commands/UpdateAllCommand.cs | 7 +- Simple.Data/Commands/UpdateByCommand.cs | 11 +- Simple.Data/Commands/UpdateCommand.cs | 35 +- Simple.Data/Commands/UpsertByCommand.cs | 149 +-- Simple.Data/Commands/UpsertCommand.cs | 168 ++-- Simple.Data/DataResult.cs | 19 + Simple.Data/DataStrategy.cs | 284 +++--- Simple.Data/DatabaseRunner.cs | 126 +-- Simple.Data/DynamicSchema.cs | 6 +- Simple.Data/DynamicTable.cs | 391 ++++---- .../Extensions/IDictionaryExtensions.cs | 7 + Simple.Data/IAdapterWithFunctions.cs | 19 - Simple.Data/IAdapterWithTransactions.cs | 81 +- Simple.Data/InMemoryAdapter.cs | 868 +++++++++--------- .../InMemoryAdapterIAdapterWithRelation.cs | 16 +- ...InMemoryAdapterIAdapterWithTransactions.cs | 152 ++- Simple.Data/MultiDataResult.cs | 19 + Simple.Data/OperationResult.cs | 10 + .../{FindOperation.cs => DeleteOperation.cs} | 46 +- Simple.Data/Operations/GetOperation.cs | 70 +- Simple.Data/Operations/InsertOperation.cs | 128 +-- Simple.Data/Operations/QueryOperation.cs | 22 + .../Operations/UpdateByCriteriaOperation.cs | 33 + .../Operations/UpdateEntityOperation.cs | 39 + Simple.Data/Operations/UpsertOperation.cs | 164 ++-- Simple.Data/OptimizingDelegateFactory.cs | 25 - Simple.Data/QueryResult.cs | 27 + Simple.Data/RunStrategy.cs | 132 +-- Simple.Data/Simple.Data.csproj | 470 +++++----- Simple.Data/SimpleQuery.cs | 31 +- Simple.Data/SimpleRecord.cs | 361 ++++---- Simple.Data/TransactionRunner.cs | 113 +-- 51 files changed, 3429 insertions(+), 3806 deletions(-) delete mode 100644 Simple.Data.Ado/AdoOptimizingDelegateFactory.cs create mode 100644 Simple.Data/CommandResult.cs create mode 100644 Simple.Data/DataResult.cs delete mode 100644 Simple.Data/IAdapterWithFunctions.cs create mode 100644 Simple.Data/MultiDataResult.cs create mode 100644 Simple.Data/OperationResult.cs rename Simple.Data/Operations/{FindOperation.cs => DeleteOperation.cs} (74%) create mode 100644 Simple.Data/Operations/QueryOperation.cs create mode 100644 Simple.Data/Operations/UpdateByCriteriaOperation.cs create mode 100644 Simple.Data/Operations/UpdateEntityOperation.cs delete mode 100644 Simple.Data/OptimizingDelegateFactory.cs create mode 100644 Simple.Data/QueryResult.cs diff --git a/Simple.Data.Ado/AdoAdapter.IAdapterWithFunctions.cs b/Simple.Data.Ado/AdoAdapter.IAdapterWithFunctions.cs index f4bca895..ef6ec975 100644 --- a/Simple.Data.Ado/AdoAdapter.IAdapterWithFunctions.cs +++ b/Simple.Data.Ado/AdoAdapter.IAdapterWithFunctions.cs @@ -7,7 +7,7 @@ namespace Simple.Data.Ado { - public partial class AdoAdapter : IAdapterWithFunctions + public partial class AdoAdapter { private readonly ConcurrentDictionary _executors = new ConcurrentDictionary(); diff --git a/Simple.Data.Ado/AdoAdapter.IAdapterWithTransactions.cs b/Simple.Data.Ado/AdoAdapter.IAdapterWithTransactions.cs index aaf3d489..65b3a278 100644 --- a/Simple.Data.Ado/AdoAdapter.IAdapterWithTransactions.cs +++ b/Simple.Data.Ado/AdoAdapter.IAdapterWithTransactions.cs @@ -1,152 +1,157 @@ -using Simple.Data.Operations; - -namespace Simple.Data.Ado -{ - using System; - using System.Collections.Generic; - using System.ComponentModel.Composition; - using System.Data; - using System.Data.SqlClient; - using System.Linq; - using Extensions; - - public partial class AdoAdapter : IAdapterWithTransactions - { - public IAdapterTransaction BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.Unspecified) - { - IDbConnection connection = CreateConnection(); - connection.OpenIfClosed(); - IDbTransaction transaction = connection.BeginTransaction(isolationLevel); - return new AdoAdapterTransaction(transaction, _sharedConnection != null); - } - - public IAdapterTransaction BeginTransaction(string name, IsolationLevel isolationLevel = IsolationLevel.Unspecified) - { - IDbConnection connection = CreateConnection(); - connection.OpenIfClosed(); - var sqlConnection = connection as SqlConnection; - IDbTransaction transaction = sqlConnection != null - ? sqlConnection.BeginTransaction(isolationLevel, name) - : connection.BeginTransaction(isolationLevel); - - return new AdoAdapterTransaction(transaction, name, _sharedConnection != null); - } - - public IEnumerable> InsertMany(string tableName, - IEnumerable> data, - IAdapterTransaction transaction, - Func, Exception, bool> onError, bool resultRequired) - { - return new AdoAdapterInserter(this, ((AdoAdapterTransaction)transaction).DbTransaction).InsertMany( - tableName, data, onError, resultRequired); - } - - public int UpdateMany(string tableName, IEnumerable> data, - IAdapterTransaction transaction) - { - IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? - new BulkUpdater(); - return bulkUpdater.Update(this, tableName, data.ToList(), ((AdoAdapterTransaction)transaction).DbTransaction); - } - - public int UpdateMany(string tableName, IEnumerable> data, - IAdapterTransaction transaction, IList keyFields) - { - IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? - new BulkUpdater(); - return bulkUpdater.Update(this, tableName, data.ToList(), ((AdoAdapterTransaction)transaction).DbTransaction); - } - - public int Update(string tableName, IDictionary data, IAdapterTransaction adapterTransaction) - { - string[] keyFieldNames = GetKeyNames(tableName).ToArray(); - if (keyFieldNames.Length == 0) throw new AdoAdapterException(string.Format("No primary key found for implicit update of table '{0}'.", tableName)); - return Update(tableName, data, GetCriteria(tableName, keyFieldNames, data), adapterTransaction); - } - - public int UpdateMany(string tableName, IList> dataList, - IEnumerable criteriaFieldNames, IAdapterTransaction adapterTransaction) - { - IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? - new BulkUpdater(); - return bulkUpdater.Update(this, tableName, dataList, criteriaFieldNames, - ((AdoAdapterTransaction)adapterTransaction).DbTransaction); - } - - //public IAdapterTransaction BeginTransaction() - //{ - // IDbConnection connection = CreateConnection(); - // connection.OpenIfClosed(); - // IDbTransaction transaction = connection.BeginTransaction(); - // return new AdoAdapterTransaction(transaction, _sharedConnection != null); - //} - - //public IAdapterTransaction BeginTransaction(string name) - //{ - // IDbConnection connection = CreateConnection(); - // connection.OpenIfClosed(); - // var sqlConnection = connection as SqlConnection; - // IDbTransaction transaction = sqlConnection != null - // ? sqlConnection.BeginTransaction(name) - // : connection.BeginTransaction(); - - // return new AdoAdapterTransaction(transaction, name, _sharedConnection != null); - //} - - public IDictionary Get(GetOperation operation, IAdapterTransaction transaction) - { - return new AdoAdapterGetter(this, ((AdoAdapterTransaction) transaction).DbTransaction).Get(operation.TableName, - operation.KeyValues); - } - - public IEnumerable> RunQuery(SimpleQuery query, IAdapterTransaction transaction, out IEnumerable unhandledClauses) - { - return new AdoAdapterQueryRunner(this, (AdoAdapterTransaction)transaction).RunQuery(query, out unhandledClauses); - } - - public IEnumerable> Find(FindOperation operation, - IAdapterTransaction transaction) - { - return new AdoAdapterFinder(this, ((AdoAdapterTransaction)transaction).DbTransaction).Find(operation.TableName, - operation.Criteria); - } - - public IDictionary Insert(string tableName, IDictionary data, - IAdapterTransaction transaction, bool resultRequired) - { - return new AdoAdapterInserter(this, ((AdoAdapterTransaction)transaction).DbTransaction).Insert(tableName, - data, resultRequired); - } - - public int Update(string tableName, IDictionary data, SimpleExpression criteria, - IAdapterTransaction transaction) - { - ICommandBuilder commandBuilder = new UpdateHelper(_schema).GetUpdateCommand(tableName, data, criteria); - return Execute(commandBuilder, transaction); - } - - public int Delete(string tableName, SimpleExpression criteria, IAdapterTransaction transaction) - { - ICommandBuilder commandBuilder = new DeleteHelper(_schema).GetDeleteCommand(tableName, criteria); - return Execute(commandBuilder, transaction); - } - - public override IDictionary Upsert(string tableName, IDictionary data, SimpleExpression criteria, bool resultRequired, IAdapterTransaction adapterTransaction) - { - var transaction = ((AdoAdapterTransaction) adapterTransaction).DbTransaction; - return new AdoAdapterUpserter(this, transaction).Upsert(tableName, data, criteria, resultRequired); - } - - public override IEnumerable> UpsertMany(string tableName, IList> list, IAdapterTransaction adapterTransaction, bool isResultRequired, Func, Exception, bool> errorCallback) - { - var transaction = ((AdoAdapterTransaction) adapterTransaction).DbTransaction; - return new AdoAdapterUpserter(this, transaction).UpsertMany(tableName, list, isResultRequired, errorCallback); - } - - public override IEnumerable> UpsertMany(string tableName, IList> list, IEnumerable keyFieldNames, IAdapterTransaction adapterTransaction, bool isResultRequired, Func, Exception, bool> errorCallback) - { - var transaction = ((AdoAdapterTransaction) adapterTransaction).DbTransaction; - return new AdoAdapterUpserter(this, transaction).UpsertMany(tableName, list, keyFieldNames.ToArray(), isResultRequired, errorCallback); - } - } +using Simple.Data.Operations; + +namespace Simple.Data.Ado +{ + using System; + using System.Collections.Generic; + using System.ComponentModel.Composition; + using System.Data; + using System.Data.SqlClient; + using System.Linq; + using Extensions; + + public partial class AdoAdapter : IAdapterWithTransactions + { + public IAdapterTransaction BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.Unspecified) + { + IDbConnection connection = CreateConnection(); + connection.OpenIfClosed(); + IDbTransaction transaction = connection.BeginTransaction(isolationLevel); + return new AdoAdapterTransaction(transaction, _sharedConnection != null); + } + + public IAdapterTransaction BeginTransaction(string name, IsolationLevel isolationLevel = IsolationLevel.Unspecified) + { + IDbConnection connection = CreateConnection(); + connection.OpenIfClosed(); + var sqlConnection = connection as SqlConnection; + IDbTransaction transaction = sqlConnection != null + ? sqlConnection.BeginTransaction(isolationLevel, name) + : connection.BeginTransaction(isolationLevel); + + return new AdoAdapterTransaction(transaction, name, _sharedConnection != null); + } + + public OperationResult Execute(IOperation operation, IAdapterTransaction transaction) + { + throw new NotImplementedException(); + } + + public IEnumerable> InsertMany(string tableName, + IEnumerable> data, + IAdapterTransaction transaction, + Func, Exception, bool> onError, bool resultRequired) + { + return new AdoAdapterInserter(this, ((AdoAdapterTransaction)transaction).DbTransaction).InsertMany( + tableName, data, onError, resultRequired); + } + + public int UpdateMany(string tableName, IEnumerable> data, + IAdapterTransaction transaction) + { + IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? + new BulkUpdater(); + return bulkUpdater.Update(this, tableName, data.ToList(), ((AdoAdapterTransaction)transaction).DbTransaction); + } + + public int UpdateMany(string tableName, IEnumerable> data, + IAdapterTransaction transaction, IList keyFields) + { + IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? + new BulkUpdater(); + return bulkUpdater.Update(this, tableName, data.ToList(), ((AdoAdapterTransaction)transaction).DbTransaction); + } + + private int Update(string tableName, IDictionary data, IAdapterTransaction adapterTransaction) + { + string[] keyFieldNames = GetKeyNames(tableName).ToArray(); + if (keyFieldNames.Length == 0) throw new AdoAdapterException(string.Format("No primary key found for implicit update of table '{0}'.", tableName)); + var readOnlyDictionary = data.ToReadOnly(); + return Update(tableName, data, GetCriteria(tableName, keyFieldNames, ref readOnlyDictionary), adapterTransaction); + } + + public int UpdateMany(string tableName, IList> dataList, + IEnumerable criteriaFieldNames, IAdapterTransaction adapterTransaction) + { + IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? + new BulkUpdater(); + return bulkUpdater.Update(this, tableName, dataList, criteriaFieldNames, + ((AdoAdapterTransaction)adapterTransaction).DbTransaction); + } + + //public IAdapterTransaction BeginTransaction() + //{ + // IDbConnection connection = CreateConnection(); + // connection.OpenIfClosed(); + // IDbTransaction transaction = connection.BeginTransaction(); + // return new AdoAdapterTransaction(transaction, _sharedConnection != null); + //} + + //public IAdapterTransaction BeginTransaction(string name) + //{ + // IDbConnection connection = CreateConnection(); + // connection.OpenIfClosed(); + // var sqlConnection = connection as SqlConnection; + // IDbTransaction transaction = sqlConnection != null + // ? sqlConnection.BeginTransaction(name) + // : connection.BeginTransaction(); + + // return new AdoAdapterTransaction(transaction, name, _sharedConnection != null); + //} + + public IDictionary Get(GetOperation operation, IAdapterTransaction transaction) + { + return new AdoAdapterGetter(this, ((AdoAdapterTransaction) transaction).DbTransaction).Get(operation.TableName, + operation.KeyValues); + } + + public IEnumerable> RunQuery(SimpleQuery query, IAdapterTransaction transaction, out IEnumerable unhandledClauses) + { + return new AdoAdapterQueryRunner(this, (AdoAdapterTransaction)transaction).RunQuery(query, out unhandledClauses); + } + + public IEnumerable> Find(QueryOperation operation, + IAdapterTransaction transaction) + { + throw new NotImplementedException(); + } + + public IDictionary Insert(string tableName, IDictionary data, + IAdapterTransaction transaction, bool resultRequired) + { + return new AdoAdapterInserter(this, ((AdoAdapterTransaction)transaction).DbTransaction).Insert(tableName, + data, resultRequired); + } + + public int Update(string tableName, IDictionary data, SimpleExpression criteria, + IAdapterTransaction transaction) + { + ICommandBuilder commandBuilder = new UpdateHelper(_schema).GetUpdateCommand(tableName, data, criteria); + return Execute(commandBuilder, transaction); + } + + public int Delete(string tableName, SimpleExpression criteria, IAdapterTransaction transaction) + { + ICommandBuilder commandBuilder = new DeleteHelper(_schema).GetDeleteCommand(tableName, criteria); + return Execute(commandBuilder, transaction); + } + + private IDictionary Upsert(string tableName, IDictionary data, SimpleExpression criteria, bool resultRequired, IAdapterTransaction adapterTransaction) + { + var transaction = ((AdoAdapterTransaction) adapterTransaction).DbTransaction; + return new AdoAdapterUpserter(this, transaction).Upsert(tableName, data, criteria, resultRequired); + } + + private IEnumerable> UpsertMany(string tableName, IList> list, IAdapterTransaction adapterTransaction, bool isResultRequired, Func, Exception, bool> errorCallback) + { + var transaction = ((AdoAdapterTransaction) adapterTransaction).DbTransaction; + return new AdoAdapterUpserter(this, transaction).UpsertMany(tableName, list, isResultRequired, errorCallback); + } + + private IEnumerable> UpsertMany(string tableName, IList> list, IEnumerable keyFieldNames, IAdapterTransaction adapterTransaction, bool isResultRequired, Func, Exception, bool> errorCallback) + { + var transaction = ((AdoAdapterTransaction) adapterTransaction).DbTransaction; + return new AdoAdapterUpserter(this, transaction).UpsertMany(tableName, list, keyFieldNames.ToArray(), isResultRequired, errorCallback); + } + } } \ No newline at end of file diff --git a/Simple.Data.Ado/AdoAdapter.cs b/Simple.Data.Ado/AdoAdapter.cs index a3e26938..be613927 100644 --- a/Simple.Data.Ado/AdoAdapter.cs +++ b/Simple.Data.Ado/AdoAdapter.cs @@ -1,381 +1,398 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.Composition; -using System.Data; -using System.Linq; -using Simple.Data.Ado.Schema; -using Simple.Data.Operations; - -namespace Simple.Data.Ado -{ - using Extensions; - - [Export("Ado", typeof (Adapter))] - public partial class AdoAdapter : Adapter, ICloneable - { - private readonly AdoAdapterFinder _finder; - private readonly ProviderHelper _providerHelper = new ProviderHelper(); - private CommandOptimizer _commandOptimizer = new CommandOptimizer(); - private IConnectionProvider _connectionProvider; - private Lazy _relatedFinder; - private DatabaseSchema _schema; - private IDbConnection _sharedConnection; - private Func _connectionModifier = connection => connection; - - public AdoAdapter() - { - _finder = new AdoAdapterFinder(this); - } - - internal AdoAdapter(IConnectionProvider connectionProvider) : this() - { - _connectionProvider = connectionProvider; - _schema = DatabaseSchema.Get(_connectionProvider, _providerHelper); - _relatedFinder = new Lazy(CreateRelatedFinder); - _commandOptimizer = ProviderHelper.GetCustomProvider(_connectionProvider) ?? - new CommandOptimizer(); - } - - private AdoAdapter(IConnectionProvider connectionProvider, AdoAdapterFinder finder, ProviderHelper providerHelper, - Lazy relatedFinder, DatabaseSchema schema) - { - _connectionProvider = connectionProvider; - _finder = finder; - _providerHelper = providerHelper; - _relatedFinder = relatedFinder; - _schema = schema; - } - - public AdoOptions AdoOptions - { - get { return Options as AdoOptions; } - } - - public CommandOptimizer CommandOptimizer - { - get { return _commandOptimizer; } - } - - public ProviderHelper ProviderHelper - { - get { return _providerHelper; } - } - - public IConnectionProvider ConnectionProvider - { - get { return _connectionProvider; } - } - - internal AdoAdapterFinder Finder - { - get { return _finder; } - } - - public bool ProviderSupportsCompoundStatements - { - get { return _connectionProvider.SupportsCompoundStatements; } - } - - public ISchemaProvider SchemaProvider - { - get { return _connectionProvider.GetSchemaProvider(); } - } - - public override IDictionary GetKey(string tableName, IDictionary record) - { - var homogenizedRecord = new Dictionary(record, HomogenizedEqualityComparer.DefaultInstance); - return GetKeyNames(tableName) - .Select(k => k.Homogenize()) - .Where(homogenizedRecord.ContainsKey) - .ToDictionary(key => key, key => homogenizedRecord[key]); - } - - #region ICloneable Members - - public object Clone() - { - return new AdoAdapter(_connectionProvider) {_connectionModifier = _connectionModifier}; - } - - #endregion - - protected override void OnSetup() - { - ICollection settingsKeys = ((IDictionary) Settings).Keys; - if (settingsKeys.Contains("ConnectionString")) - { - if (settingsKeys.Contains("ProviderName")) - { - _connectionProvider = ProviderHelper.GetProviderByConnectionString(Settings.ConnectionString, - Settings.ProviderName); - } - else - { - _connectionProvider = ProviderHelper.GetProviderByConnectionString(Settings.ConnectionString); - } - } - else if (settingsKeys.Contains("Filename")) - { - _connectionProvider = ProviderHelper.GetProviderByFilename(Settings.Filename); - } - else if (settingsKeys.Contains("ConnectionName")) - { - _connectionProvider = ProviderHelper.GetProviderByConnectionName(Settings.ConnectionName); - } - _schema = DatabaseSchema.Get(_connectionProvider, _providerHelper); - _relatedFinder = new Lazy(CreateRelatedFinder); - _commandOptimizer = ProviderHelper.GetCustomProvider(_connectionProvider) ?? - new CommandOptimizer(); - } - - private AdoAdapterRelatedFinder CreateRelatedFinder() - { - return new AdoAdapterRelatedFinder(this); - } - - public override IDictionary Get(GetOperation operation) - { - // We don't need to implement Get because we provide a delegate for this operation... - throw new NotImplementedException(); - } - - public override IDictionary FindOne(FindOperation operation) - { - return _finder.FindOne(operation.TableName, operation.Criteria); - } - - public override Func> CreateFindOneDelegate(string tableName, - SimpleExpression criteria) - { - return _finder.CreateFindOneDelegate(tableName, criteria); - } - - public override IEnumerable> Find(FindOperation operation) - { - return _finder.Find(operation.TableName, operation.Criteria); - } - - public override IEnumerable> RunQuery(SimpleQuery query, - out IEnumerable - unhandledClauses) - { - return new AdoAdapterQueryRunner(this).RunQuery(query, out unhandledClauses); - } - - - public override IEnumerable>> RunQueries(SimpleQuery[] queries, - List - < - IEnumerable - > - unhandledClauses) - { - return new AdoAdapterQueryRunner(this).RunQueries(queries, unhandledClauses); - } - - public override bool IsExpressionFunction(string functionName, params object[] args) - { - return FunctionIsLikeOrNotLike(functionName, args); - } - - private static bool FunctionIsLikeOrNotLike(string functionName, object[] args) - { - return ((functionName.Equals("like", StringComparison.OrdinalIgnoreCase) - || functionName.Equals("notlike", StringComparison.OrdinalIgnoreCase)) - && args.Length == 1 - && args[0] is string); - } - - public override IObservable> RunQueryAsObservable(SimpleQuery query, - out - IEnumerable - - unhandledClauses) - { - return new AdoAdapterQueryRunner(this).RunQueryAsObservable(query, out unhandledClauses); - } - - public override IDictionary Insert(string tableName, IDictionary data, bool resultRequired) - { - return new AdoAdapterInserter(this).Insert(tableName, data, resultRequired); - } - - public override IEnumerable> InsertMany(string tableName, - IEnumerable> - data, Func, Exception, bool> onError, bool resultRequired) - { - return new AdoAdapterInserter(this).InsertMany(tableName, data, onError, resultRequired); - } - - public override int UpdateMany(string tableName, IEnumerable> data, - IEnumerable criteriaFieldNames) - { - IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? - new BulkUpdater(); - return bulkUpdater.Update(this, tableName, data.ToList(), criteriaFieldNames, null); - } - - public override int UpdateMany(string tableName, IEnumerable> data) - { - IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? - new BulkUpdater(); - return bulkUpdater.Update(this, tableName, data.ToList(), null); - } - - public override int Update(string tableName, IDictionary data, SimpleExpression criteria) - { - ICommandBuilder commandBuilder = new UpdateHelper(_schema).GetUpdateCommand(tableName, data, criteria); - return Execute(commandBuilder); - } - - /// - /// Deletes from the specified table. - /// - /// Name of the table. - /// The expression to use as criteria for the delete operation. - /// The number of records which were deleted. - public override int Delete(string tableName, SimpleExpression criteria) - { - ICommandBuilder commandBuilder = new DeleteHelper(_schema).GetDeleteCommand(tableName, criteria); - return Execute(commandBuilder); - } - - /// - /// Gets the names of the fields which comprise the unique identifier for the specified table. - /// - /// Name of the table. - /// A list of field names; an empty list if no key is defined. - public override IList GetKeyNames(string tableName) - { - return _schema.FindTable(tableName).PrimaryKey.AsEnumerable().ToList(); - } - - public void SetConnectionModifier(Func connectionModifer) - { - _connectionModifier = connectionModifer; - } - - public void ClearConnectionModifier() - { - _connectionModifier = connection => connection; - } - - private int Execute(ICommandBuilder commandBuilder) - { - IDbConnection connection = CreateConnection(); - using (connection.MaybeDisposable()) - { - using (IDbCommand command = commandBuilder.GetCommand(connection, AdoOptions)) - { - connection.OpenIfClosed(); - return command.TryExecuteNonQuery(); - } - } - } - - internal int Execute(ICommandBuilder commandBuilder, IDbConnection connection) - { - using (connection.MaybeDisposable()) - { - using (IDbCommand command = commandBuilder.GetCommand(connection, AdoOptions)) - { - connection.OpenIfClosed(); - return command.TryExecuteNonQuery(); - } - } - } - - internal int Execute(ICommandBuilder commandBuilder, IAdapterTransaction transaction) - { - IDbTransaction dbTransaction = ((AdoAdapterTransaction) transaction).DbTransaction; - return Execute(commandBuilder, dbTransaction); - } - - internal int Execute(ICommandBuilder commandBuilder, IDbTransaction dbTransaction) - { - using (IDbCommand command = commandBuilder.GetCommand(dbTransaction.Connection, AdoOptions)) - { - command.Transaction = dbTransaction; - return command.TryExecuteNonQuery(); - } - } - - public void UseSharedConnection(IDbConnection connection) - { - _sharedConnection = connection; - } - - public void StopUsingSharedConnection() - { - _sharedConnection = null; - } - - public IDbConnection CreateConnection() - { - if (_sharedConnection != null) return _sharedConnection; - var connection = _connectionModifier(_connectionProvider.CreateConnection()); - var args = ConnectionCreated.Raise(this, () => new ConnectionCreatedEventArgs(connection)); - if (args != null && args.OverriddenConnection != null) - { - return args.OverriddenConnection; - } - return connection; - } - - public DatabaseSchema GetSchema() - { - return _schema ?? (_schema = DatabaseSchema.Get(_connectionProvider, _providerHelper)); - } - - public override IDictionary Upsert(string tableName, IDictionary data, SimpleExpression criteria, bool resultRequired) - { - return new AdoAdapterUpserter(this).Upsert(tableName, data, criteria, resultRequired); - } - - public override IEnumerable> UpsertMany(string tableName, IList> list, bool isResultRequired, Func, Exception, bool> errorCallback) - { - var upserter = new AdoAdapterUpserter(this); - return upserter.UpsertMany(tableName, list, isResultRequired, errorCallback); - } - - public override IEnumerable> UpsertMany(string tableName, IList> list, IEnumerable keyFieldNames, bool isResultRequired, Func, Exception, bool> errorCallback) - { - return new AdoAdapterUpserter(this).UpsertMany(tableName, list, keyFieldNames.ToArray(), isResultRequired, errorCallback); - } - - public string GetIdentityFunction() - { - return _connectionProvider.GetIdentityFunction(); - } - - protected override void OnReset() - { - DatabaseSchema.ClearCache(); - _schema = DatabaseSchema.Get(_connectionProvider, _providerHelper); - } - - public static event EventHandler ConnectionCreated; - } - - public class ConnectionCreatedEventArgs : EventArgs - { - private readonly IDbConnection _connection; - - public ConnectionCreatedEventArgs(IDbConnection connection) - { - _connection = connection; - } - - public IDbConnection Connection - { - get { return _connection; } - } - - internal IDbConnection OverriddenConnection { get; private set; } - - public void OverrideConnection(IDbConnection overridingConnection) - { - OverriddenConnection = overridingConnection; - } - } -} +using System; +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.Data; +using System.Linq; +using Simple.Data.Ado.Schema; +using Simple.Data.Operations; + +namespace Simple.Data.Ado +{ + using System.Collections.ObjectModel; + using Extensions; + + [Export("Ado", typeof (Adapter))] + public partial class AdoAdapter : Adapter, ICloneable + { + private readonly AdoAdapterFinder _finder; + private readonly ProviderHelper _providerHelper = new ProviderHelper(); + private CommandOptimizer _commandOptimizer = new CommandOptimizer(); + private IConnectionProvider _connectionProvider; + private Lazy _relatedFinder; + private DatabaseSchema _schema; + private IDbConnection _sharedConnection; + private Func _connectionModifier = connection => connection; + + public AdoAdapter() + { + _finder = new AdoAdapterFinder(this); + } + + internal AdoAdapter(IConnectionProvider connectionProvider) : this() + { + _connectionProvider = connectionProvider; + _schema = DatabaseSchema.Get(_connectionProvider, _providerHelper); + _relatedFinder = new Lazy(CreateRelatedFinder); + _commandOptimizer = ProviderHelper.GetCustomProvider(_connectionProvider) ?? + new CommandOptimizer(); + } + + private AdoAdapter(IConnectionProvider connectionProvider, AdoAdapterFinder finder, ProviderHelper providerHelper, + Lazy relatedFinder, DatabaseSchema schema) + { + _connectionProvider = connectionProvider; + _finder = finder; + _providerHelper = providerHelper; + _relatedFinder = relatedFinder; + _schema = schema; + } + + public AdoOptions AdoOptions + { + get { return Options as AdoOptions; } + } + + public CommandOptimizer CommandOptimizer + { + get { return _commandOptimizer; } + } + + public ProviderHelper ProviderHelper + { + get { return _providerHelper; } + } + + public IConnectionProvider ConnectionProvider + { + get { return _connectionProvider; } + } + + internal AdoAdapterFinder Finder + { + get { return _finder; } + } + + public bool ProviderSupportsCompoundStatements + { + get { return _connectionProvider.SupportsCompoundStatements; } + } + + public ISchemaProvider SchemaProvider + { + get { return _connectionProvider.GetSchemaProvider(); } + } + + public override IEqualityComparer KeyComparer + { + get { return HomogenizedEqualityComparer.DefaultInstance; } + } + + public override IReadOnlyDictionary GetKey(string tableName, IReadOnlyDictionary record) + { + var homogenizedRecord = new Dictionary(HomogenizedEqualityComparer.DefaultInstance); + return GetKeyNames(tableName) + .Select(k => k.Homogenize()) + .Where(homogenizedRecord.ContainsKey) + .ToDictionary(key => key, key => homogenizedRecord[key]); + } + + #region ICloneable Members + + public object Clone() + { + return new AdoAdapter(_connectionProvider) {_connectionModifier = _connectionModifier}; + } + + #endregion + + protected override void OnSetup() + { + ICollection settingsKeys = ((IDictionary) Settings).Keys; + if (settingsKeys.Contains("ConnectionString")) + { + if (settingsKeys.Contains("ProviderName")) + { + _connectionProvider = ProviderHelper.GetProviderByConnectionString(Settings.ConnectionString, + Settings.ProviderName); + } + else + { + _connectionProvider = ProviderHelper.GetProviderByConnectionString(Settings.ConnectionString); + } + } + else if (settingsKeys.Contains("Filename")) + { + _connectionProvider = ProviderHelper.GetProviderByFilename(Settings.Filename); + } + else if (settingsKeys.Contains("ConnectionName")) + { + _connectionProvider = ProviderHelper.GetProviderByConnectionName(Settings.ConnectionName); + } + _schema = DatabaseSchema.Get(_connectionProvider, _providerHelper); + _relatedFinder = new Lazy(CreateRelatedFinder); + _commandOptimizer = ProviderHelper.GetCustomProvider(_connectionProvider) ?? + new CommandOptimizer(); + } + + private AdoAdapterRelatedFinder CreateRelatedFinder() + { + return new AdoAdapterRelatedFinder(this); + } + + public override OperationResult Execute(IOperation operation) + { + throw new NotImplementedException(); + } + + public OperationResult Execute(FunctionOperation operation) + { + throw new NotImplementedException(); + } + + private IDictionary Get(GetOperation operation) + { + // We don't need to implement Get because we provide a delegate for this operation... + throw new NotImplementedException(); + } + + private IDictionary FindOne(QueryOperation operation) + { + return operation.Query.FirstOrDefault(); + } + + private Func> CreateFindOneDelegate(string tableName, + SimpleExpression criteria) + { + return _finder.CreateFindOneDelegate(tableName, criteria); + } + + private IEnumerable> Find(QueryOperation operation) + { + IEnumerable _; + return RunQuery(operation.Query, out _); + } + + private IEnumerable> RunQuery(SimpleQuery query, + out IEnumerable + unhandledClauses) + { + return new AdoAdapterQueryRunner(this).RunQuery(query, out unhandledClauses); + } + + + private IEnumerable>> RunQueries(SimpleQuery[] queries, + List + < + IEnumerable + > + unhandledClauses) + { + return new AdoAdapterQueryRunner(this).RunQueries(queries, unhandledClauses); + } + + public override bool IsExpressionFunction(string functionName, params object[] args) + { + return FunctionIsLikeOrNotLike(functionName, args); + } + + private static bool FunctionIsLikeOrNotLike(string functionName, object[] args) + { + return ((functionName.Equals("like", StringComparison.OrdinalIgnoreCase) + || functionName.Equals("notlike", StringComparison.OrdinalIgnoreCase)) + && args.Length == 1 + && args[0] is string); + } + + private IObservable> RunQueryAsObservable(SimpleQuery query, + out + IEnumerable + + unhandledClauses) + { + return new AdoAdapterQueryRunner(this).RunQueryAsObservable(query, out unhandledClauses); + } + + private IDictionary Insert(string tableName, IDictionary data, bool resultRequired) + { + return new AdoAdapterInserter(this).Insert(tableName, data, resultRequired); + } + + private IEnumerable> InsertMany(string tableName, + IEnumerable> + data, Func, Exception, bool> onError, bool resultRequired) + { + return new AdoAdapterInserter(this).InsertMany(tableName, data, onError, resultRequired); + } + + private int UpdateMany(string tableName, IEnumerable> data, + IEnumerable criteriaFieldNames) + { + IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? + new BulkUpdater(); + return bulkUpdater.Update(this, tableName, data.ToList(), criteriaFieldNames, null); + } + + private int UpdateMany(string tableName, IEnumerable> data) + { + IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? + new BulkUpdater(); + return bulkUpdater.Update(this, tableName, data.ToList(), null); + } + + private int Update(string tableName, IDictionary data, SimpleExpression criteria) + { + ICommandBuilder commandBuilder = new UpdateHelper(_schema).GetUpdateCommand(tableName, data, criteria); + return Execute(commandBuilder); + } + + /// + /// Deletes from the specified table. + /// + /// Name of the table. + /// The expression to use as criteria for the delete operation. + /// The number of records which were deleted. + private int Delete(string tableName, SimpleExpression criteria) + { + ICommandBuilder commandBuilder = new DeleteHelper(_schema).GetDeleteCommand(tableName, criteria); + return Execute(commandBuilder); + } + + /// + /// Gets the names of the fields which comprise the unique identifier for the specified table. + /// + /// Name of the table. + /// A list of field names; an empty list if no key is defined. + public override IList GetKeyNames(string tableName) + { + return _schema.FindTable(tableName).PrimaryKey.AsEnumerable().ToList(); + } + + public void SetConnectionModifier(Func connectionModifer) + { + _connectionModifier = connectionModifer; + } + + public void ClearConnectionModifier() + { + _connectionModifier = connection => connection; + } + + private int Execute(ICommandBuilder commandBuilder) + { + IDbConnection connection = CreateConnection(); + using (connection.MaybeDisposable()) + { + using (IDbCommand command = commandBuilder.GetCommand(connection, AdoOptions)) + { + connection.OpenIfClosed(); + return command.TryExecuteNonQuery(); + } + } + } + + internal int Execute(ICommandBuilder commandBuilder, IDbConnection connection) + { + using (connection.MaybeDisposable()) + { + using (IDbCommand command = commandBuilder.GetCommand(connection, AdoOptions)) + { + connection.OpenIfClosed(); + return command.TryExecuteNonQuery(); + } + } + } + + internal int Execute(ICommandBuilder commandBuilder, IAdapterTransaction transaction) + { + IDbTransaction dbTransaction = ((AdoAdapterTransaction) transaction).DbTransaction; + return Execute(commandBuilder, dbTransaction); + } + + internal int Execute(ICommandBuilder commandBuilder, IDbTransaction dbTransaction) + { + using (IDbCommand command = commandBuilder.GetCommand(dbTransaction.Connection, AdoOptions)) + { + command.Transaction = dbTransaction; + return command.TryExecuteNonQuery(); + } + } + + public void UseSharedConnection(IDbConnection connection) + { + _sharedConnection = connection; + } + + public void StopUsingSharedConnection() + { + _sharedConnection = null; + } + + public IDbConnection CreateConnection() + { + if (_sharedConnection != null) return _sharedConnection; + var connection = _connectionModifier(_connectionProvider.CreateConnection()); + var args = ConnectionCreated.Raise(this, () => new ConnectionCreatedEventArgs(connection)); + if (args != null && args.OverriddenConnection != null) + { + return args.OverriddenConnection; + } + return connection; + } + + public DatabaseSchema GetSchema() + { + return _schema ?? (_schema = DatabaseSchema.Get(_connectionProvider, _providerHelper)); + } + + private IDictionary Upsert(string tableName, IDictionary data, SimpleExpression criteria, bool resultRequired) + { + return new AdoAdapterUpserter(this).Upsert(tableName, data, criteria, resultRequired); + } + + private IEnumerable> UpsertMany(string tableName, IList> list, bool isResultRequired, Func, Exception, bool> errorCallback) + { + var upserter = new AdoAdapterUpserter(this); + return upserter.UpsertMany(tableName, list, isResultRequired, errorCallback); + } + + private IEnumerable> UpsertMany(string tableName, IList> list, IEnumerable keyFieldNames, bool isResultRequired, Func, Exception, bool> errorCallback) + { + return new AdoAdapterUpserter(this).UpsertMany(tableName, list, keyFieldNames.ToArray(), isResultRequired, errorCallback); + } + + public string GetIdentityFunction() + { + return _connectionProvider.GetIdentityFunction(); + } + + protected override void OnReset() + { + DatabaseSchema.ClearCache(); + _schema = DatabaseSchema.Get(_connectionProvider, _providerHelper); + } + + public static event EventHandler ConnectionCreated; + } + + public class ConnectionCreatedEventArgs : EventArgs + { + private readonly IDbConnection _connection; + + public ConnectionCreatedEventArgs(IDbConnection connection) + { + _connection = connection; + } + + public IDbConnection Connection + { + get { return _connection; } + } + + internal IDbConnection OverriddenConnection { get; private set; } + + public void OverrideConnection(IDbConnection overridingConnection) + { + OverriddenConnection = overridingConnection; + } + } +} diff --git a/Simple.Data.Ado/AdoAdapterRelatedFinder.cs b/Simple.Data.Ado/AdoAdapterRelatedFinder.cs index 0c2af6f4..952170f9 100644 --- a/Simple.Data.Ado/AdoAdapterRelatedFinder.cs +++ b/Simple.Data.Ado/AdoAdapterRelatedFinder.cs @@ -1,80 +1,80 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using Simple.Data.Ado.Schema; -using Simple.Data.Operations; - -namespace Simple.Data.Ado -{ - class AdoAdapterRelatedFinder - { - private readonly Lazy, TableJoin>> _tableJoins = - new Lazy, TableJoin>>( - () => new ConcurrentDictionary, TableJoin>(), LazyThreadSafetyMode.ExecutionAndPublication - ); - - private readonly AdoAdapter _adapter; - - public AdoAdapterRelatedFinder(AdoAdapter adapter) - { - _adapter = adapter; - } - - public bool IsValidRelation(string tableName, string relatedTableName) - { - return TryJoin(tableName, relatedTableName) != null; - } - - public object FindRelated(string tableName, IDictionary row, string relatedTableName) - { - var join = TryJoin(tableName, relatedTableName); - if (join == null) throw new AdoAdapterException(string.Format("Could not resolve relationship of tables '{0}' and '{1}'.", tableName, relatedTableName)); - - if (join.Master == _adapter.GetSchema().FindTable(tableName)) - { - return GetDetail(row, join); - } - return GetMaster(row, join); - } - - private TableJoin TryJoin(string tableName, string relatedTableName) - { - return _tableJoins.Value.GetOrAdd(Tuple.Create(tableName, relatedTableName), - t => TryCreateJoin(t.Item1, t.Item2)); - } - - private TableJoin TryCreateJoin(string tableName, string relatedTableName) - { - return TryMasterJoin(tableName, relatedTableName) ?? TryDetailJoin(tableName, relatedTableName); - } - - private TableJoin TryMasterJoin(string tableName, string relatedTableName) - { - return _adapter.GetSchema().FindTable(tableName).GetMaster(relatedTableName); - } - - private TableJoin TryDetailJoin(string tableName, string relatedTableName) - { - return _adapter.GetSchema().FindTable(tableName).GetDetail(relatedTableName); - } - - private IDictionary GetMaster(IDictionary row, TableJoin masterJoin) - { - var criteria = new Dictionary { { masterJoin.MasterColumn.ActualName, row[masterJoin.DetailColumn.HomogenizedName] } }; - return _adapter.Find(new FindOperation(masterJoin.Master.ActualName, - ExpressionHelper.CriteriaDictionaryToExpression(masterJoin.Master.ActualName, - criteria))).FirstOrDefault(); - } - - private SimpleQuery GetDetail(IDictionary row, TableJoin join) - { - var criteria = ExpressionHelper.CriteriaDictionaryToExpression(join.Detail.ActualName, - new Dictionary - {{join.DetailColumn.ActualName, row[join.MasterColumn.HomogenizedName]}}); - return new SimpleQuery(_adapter, null, join.Detail.ActualName).Where(criteria); - } - } -} +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using Simple.Data.Ado.Schema; +using Simple.Data.Operations; + +namespace Simple.Data.Ado +{ + class AdoAdapterRelatedFinder + { + private readonly Lazy, TableJoin>> _tableJoins = + new Lazy, TableJoin>>( + () => new ConcurrentDictionary, TableJoin>(), LazyThreadSafetyMode.ExecutionAndPublication + ); + + private readonly AdoAdapter _adapter; + + public AdoAdapterRelatedFinder(AdoAdapter adapter) + { + _adapter = adapter; + } + + public bool IsValidRelation(string tableName, string relatedTableName) + { + return TryJoin(tableName, relatedTableName) != null; + } + + public object FindRelated(string tableName, IDictionary row, string relatedTableName) + { + var join = TryJoin(tableName, relatedTableName); + if (join == null) throw new AdoAdapterException(string.Format("Could not resolve relationship of tables '{0}' and '{1}'.", tableName, relatedTableName)); + + if (join.Master == _adapter.GetSchema().FindTable(tableName)) + { + return GetDetail(row, join); + } + return GetMaster(row, join); + } + + private TableJoin TryJoin(string tableName, string relatedTableName) + { + return _tableJoins.Value.GetOrAdd(Tuple.Create(tableName, relatedTableName), + t => TryCreateJoin(t.Item1, t.Item2)); + } + + private TableJoin TryCreateJoin(string tableName, string relatedTableName) + { + return TryMasterJoin(tableName, relatedTableName) ?? TryDetailJoin(tableName, relatedTableName); + } + + private TableJoin TryMasterJoin(string tableName, string relatedTableName) + { + return _adapter.GetSchema().FindTable(tableName).GetMaster(relatedTableName); + } + + private TableJoin TryDetailJoin(string tableName, string relatedTableName) + { + return _adapter.GetSchema().FindTable(tableName).GetDetail(relatedTableName); + } + + private IDictionary GetMaster(IDictionary row, TableJoin masterJoin) + { + throw new NotImplementedException(); + //var criteria = new Dictionary { { masterJoin.MasterColumn.ActualName, row[masterJoin.DetailColumn.HomogenizedName] } }; + //return _adapter.RunQuery(new QueryOperation(new QueryOperation(_adapter, masterJoin.Master.ActualName, ExpressionHelper.CriteriaDictionaryToExpression(masterJoin.Master.ActualName, + // criteria))).FirstOrDefault(); + } + + private SimpleQuery GetDetail(IDictionary row, TableJoin join) + { + var criteria = ExpressionHelper.CriteriaDictionaryToExpression(join.Detail.ActualName, + new Dictionary + {{join.DetailColumn.ActualName, row[join.MasterColumn.HomogenizedName]}}); + return new SimpleQuery(_adapter, null, join.Detail.ActualName).Where(criteria); + } + } +} diff --git a/Simple.Data.Ado/AdoAdapterUpserter.cs b/Simple.Data.Ado/AdoAdapterUpserter.cs index 956695ec..6e5eb61f 100644 --- a/Simple.Data.Ado/AdoAdapterUpserter.cs +++ b/Simple.Data.Ado/AdoAdapterUpserter.cs @@ -82,7 +82,7 @@ public IEnumerable> UpsertMany(string tableName, ILi IDictionary result; try { - var key = _adapter.GetKey(tableName, row); + var key = _adapter.GetKey(tableName, row.ToReadOnly()); if (key.Count == 0) { result = new AdoAdapterInserter(_adapter).Insert(tableName, row, isResultRequired); diff --git a/Simple.Data.Ado/AdoOptimizingDelegateFactory.cs b/Simple.Data.Ado/AdoOptimizingDelegateFactory.cs deleted file mode 100644 index 6f3a12e3..00000000 --- a/Simple.Data.Ado/AdoOptimizingDelegateFactory.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Simple.Data.Operations; - -namespace Simple.Data.Ado -{ - using System.ComponentModel.Composition; - - [Export(typeof(OptimizingDelegateFactory))] - public class AdoOptimizingDelegateFactory : OptimizingDelegateFactory - { - public override Func> CreateFindOneDelegate(Adapter adapter, string tableName, SimpleExpression criteria) - { - return new AdoAdapterFinder((AdoAdapter)adapter).CreateFindOneDelegate(tableName, criteria); - } - - public override Func> CreateGetDelegate(Adapter adapter, GetOperation operation) - { - return new AdoAdapterGetter((AdoAdapter) adapter).CreateGetDelegate(operation.TableName, operation.KeyValues); - } - } -} diff --git a/Simple.Data.Ado/Simple.Data.Ado.csproj b/Simple.Data.Ado/Simple.Data.Ado.csproj index b91ba8ab..0c3e0eeb 100644 --- a/Simple.Data.Ado/Simple.Data.Ado.csproj +++ b/Simple.Data.Ado/Simple.Data.Ado.csproj @@ -1,180 +1,179 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} - Library - Properties - Simple.Data.Ado - Simple.Data.Ado - 512 - v4.5 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - SecurityRules.ruleset - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - - - - - - - - - - - - - CommonAssemblyInfo.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - True - Settings.settings - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} + Library + Properties + Simple.Data.Ado + Simple.Data.Ado + 512 + v4.5 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + SecurityRules.ruleset + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + + + + + CommonAssemblyInfo.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + True + Settings.settings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + --> \ No newline at end of file diff --git a/Simple.Data.UnitTest/AdapterFactoryTest.cs b/Simple.Data.UnitTest/AdapterFactoryTest.cs index a026a2d8..e5be2d19 100644 --- a/Simple.Data.UnitTest/AdapterFactoryTest.cs +++ b/Simple.Data.UnitTest/AdapterFactoryTest.cs @@ -1,102 +1,77 @@ -using Simple.Data.Operations; - -namespace Simple.Data.UnitTest -{ - using System; - using System.Collections.Generic; - using NUnit.Framework; - - [TestFixture] - public class AdapterFactoryTest - { - private static AdapterFactory CreateTarget() - { - return new CachingAdapterFactory(new StubComposer()); - } - - [Test] - [ExpectedException(typeof(ArgumentException))] - public void CreateWithAnonymousObjectWithoutConnectionStringThrowsArgumentException() - { - CreateTarget().Create(new { X = "" }); - } - - [Test] - public void CreateWithName() - { - var actual = CreateTarget().Create("Stub", null); - Assert.IsNotNull(actual); - } - } - - class StubComposer : Composer - { - public override T Compose() - { - return (T) Create(); - } - - public override T Compose(string contractName) - { - return (T)Create(); - } - - private object Create() - { - return new StubAdapter(); - } - } - - class StubAdapter : Adapter - { - public override IDictionary GetKey(string tableName, IDictionary record) - { - throw new NotImplementedException(); - } - - public override IList GetKeyNames(string tableName) - { - throw new NotImplementedException(); - } - - public override IDictionary Get(GetOperation operation) - { - throw new NotImplementedException(); - } - - public override IEnumerable> Find(FindOperation operation) - { - throw new NotImplementedException(); - } - - public override IEnumerable> RunQuery(SimpleQuery query, out IEnumerable unhandledClauses) - { - throw new NotImplementedException(); - } - - public override IDictionary Insert(string tableName, IDictionary data, bool resultRequired) - { - throw new NotImplementedException(); - } - - public override int Update(string tableName, IDictionary data, SimpleExpression criteria) - { - throw new NotImplementedException(); - } - - public override int Delete(string tableName, SimpleExpression criteria) - { - throw new NotImplementedException(); - } - - public override IEnumerable>> RunQueries(SimpleQuery[] queries, List> unhandledClauses) - { - throw new NotImplementedException(); - } - - public override bool IsExpressionFunction(string functionName, params object[] args) - { - throw new NotImplementedException(); - } - } -} +using Simple.Data.Operations; + +namespace Simple.Data.UnitTest +{ + using System; + using System.Collections.Generic; + using NUnit.Framework; + + [TestFixture] + public class AdapterFactoryTest + { + private static AdapterFactory CreateTarget() + { + return new CachingAdapterFactory(new StubComposer()); + } + + [Test] + [ExpectedException(typeof(ArgumentException))] + public void CreateWithAnonymousObjectWithoutConnectionStringThrowsArgumentException() + { + CreateTarget().Create(new { X = "" }); + } + + [Test] + public void CreateWithName() + { + var actual = CreateTarget().Create("Stub", null); + Assert.IsNotNull(actual); + } + } + + class StubComposer : Composer + { + public override T Compose() + { + return (T) Create(); + } + + public override T Compose(string contractName) + { + return (T)Create(); + } + + private object Create() + { + return new StubAdapter(); + } + } + + class StubAdapter : Adapter + { + public override IEqualityComparer KeyComparer + { + get { return StringComparer.OrdinalIgnoreCase; } + } + + public override IReadOnlyDictionary GetKey(string tableName, IReadOnlyDictionary record) + { + throw new NotImplementedException(); + } + + public override IList GetKeyNames(string tableName) + { + throw new NotImplementedException(); + } + + public override OperationResult Execute(IOperation operation) + { + throw new NotImplementedException(); + } + + public override bool IsExpressionFunction(string functionName, params object[] args) + { + throw new NotImplementedException(); + } + } +} diff --git a/Simple.Data.UnitTest/BeginTransactionWithIsolataionLevelTest.cs b/Simple.Data.UnitTest/BeginTransactionWithIsolataionLevelTest.cs index 81378771..879d92f4 100644 --- a/Simple.Data.UnitTest/BeginTransactionWithIsolataionLevelTest.cs +++ b/Simple.Data.UnitTest/BeginTransactionWithIsolataionLevelTest.cs @@ -1,116 +1,67 @@ -using System; -using System.Collections.Generic; -using System.Data; -using NUnit.Framework; -using Simple.Data.Operations; - -namespace Simple.Data.UnitTest -{ - [TestFixture] - class BeginTransactionWithIsolataionLevelTest - { - [Test] - public void TransactionsGetUnspecifiedIsolationLevelByDefault() - { - var adapter = new StubAdapterWithTransaction(); - Database db = new Database(adapter); - db.BeginTransaction(); - - Assert.AreEqual(IsolationLevel.Unspecified, adapter.IsolationLevel); - } - - [Test] - public void TransactionsGetExplicitlySetIsolationLevel() - { - var adapter = new StubAdapterWithTransaction(); - Database db = new Database(adapter); - db.BeginTransaction(IsolationLevel.Serializable); - - Assert.AreEqual(IsolationLevel.Serializable, adapter.IsolationLevel); - } - - [Test] - public void NamedTransactionsGetUnspecifiedIsolationLevel() - { - var adapter = new StubAdapterWithTransaction(); - Database db = new Database(adapter); - db.BeginTransaction("tran name"); - - Assert.AreEqual(IsolationLevel.Unspecified, adapter.IsolationLevel); - } - } - - class StubAdapterWithTransaction : StubAdapter, IAdapterWithTransactions - { - public string TransactionName; - public IsolationLevel IsolationLevel; - - public IAdapterTransaction BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.Unspecified) - { - this.IsolationLevel = isolationLevel; - return null; - } - - public IAdapterTransaction BeginTransaction(string name, IsolationLevel isolationLevel = IsolationLevel.Unspecified) - { - this.IsolationLevel = isolationLevel; - this.TransactionName = name; - return null; - } - - #region IAdapterWithTransactions - not implementead - - public IEnumerable> Find(FindOperation operation, IAdapterTransaction transaction) - { - throw new NotImplementedException(); - } - - public IDictionary Insert(string tableName, IDictionary data, IAdapterTransaction transaction, bool resultRequired) - { - throw new NotImplementedException(); - } - - public IEnumerable> InsertMany(string tableName, IEnumerable> data, IAdapterTransaction transaction, Func, Exception, bool> onError, bool resultRequired) - { - throw new NotImplementedException(); - } - - public int Update(string tableName, IDictionary data, SimpleExpression criteria, IAdapterTransaction transaction) - { - throw new NotImplementedException(); - } - - public int Delete(string tableName, SimpleExpression criteria, IAdapterTransaction transaction) - { - throw new NotImplementedException(); - } - - public int UpdateMany(string tableName, IEnumerable> dataList, IAdapterTransaction adapterTransaction) - { - throw new NotImplementedException(); - } - - public int UpdateMany(string tableName, IEnumerable> dataList, IAdapterTransaction adapterTransaction, IList keyFields) - { - throw new NotImplementedException(); - } - - public int UpdateMany(string tableName, IList> dataList, IEnumerable criteriaFieldNames, IAdapterTransaction adapterTransaction) - { - throw new NotImplementedException(); - } - - public IDictionary Get(GetOperation operation, IAdapterTransaction transaction) - { - throw new NotImplementedException(); - } - - public IEnumerable> RunQuery(SimpleQuery query, IAdapterTransaction transaction, out IEnumerable unhandledClauses) - { - throw new NotImplementedException(); - } - - #endregion - } - +using System; +using System.Collections.Generic; +using System.Data; +using NUnit.Framework; +using Simple.Data.Operations; + +namespace Simple.Data.UnitTest +{ + [TestFixture] + class BeginTransactionWithIsolataionLevelTest + { + [Test] + public void TransactionsGetUnspecifiedIsolationLevelByDefault() + { + var adapter = new StubAdapterWithTransaction(); + Database db = new Database(adapter); + db.BeginTransaction(); + + Assert.AreEqual(IsolationLevel.Unspecified, adapter.IsolationLevel); + } + + [Test] + public void TransactionsGetExplicitlySetIsolationLevel() + { + var adapter = new StubAdapterWithTransaction(); + Database db = new Database(adapter); + db.BeginTransaction(IsolationLevel.Serializable); + + Assert.AreEqual(IsolationLevel.Serializable, adapter.IsolationLevel); + } + + [Test] + public void NamedTransactionsGetUnspecifiedIsolationLevel() + { + var adapter = new StubAdapterWithTransaction(); + Database db = new Database(adapter); + db.BeginTransaction("tran name"); + + Assert.AreEqual(IsolationLevel.Unspecified, adapter.IsolationLevel); + } + } + + class StubAdapterWithTransaction : StubAdapter, IAdapterWithTransactions + { + public string TransactionName; + public IsolationLevel IsolationLevel; + + public IAdapterTransaction BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.Unspecified) + { + this.IsolationLevel = isolationLevel; + return null; + } + + public IAdapterTransaction BeginTransaction(string name, IsolationLevel isolationLevel = IsolationLevel.Unspecified) + { + this.IsolationLevel = isolationLevel; + this.TransactionName = name; + return null; + } + + public OperationResult Execute(IOperation operation, IAdapterTransaction transaction) + { + throw new NotImplementedException(); + } + } + } \ No newline at end of file diff --git a/Simple.Data.UnitTest/MethodNameParserTest.cs b/Simple.Data.UnitTest/MethodNameParserTest.cs index 37912608..f081a692 100644 --- a/Simple.Data.UnitTest/MethodNameParserTest.cs +++ b/Simple.Data.UnitTest/MethodNameParserTest.cs @@ -5,8 +5,9 @@ namespace Simple.Data.UnitTest { - - + using System.Collections.ObjectModel; + + /// ///This is a test class for MethodNameParserTest and is intended ///to contain all MethodNameParserTest Unit Tests @@ -34,8 +35,8 @@ public void ParseFromMethodNameTest() { const string methodName = "FindByThisAndThat"; IList args = new object[] {1, "Foo"}; - IDictionary expected = new Dictionary { {"This", 1}, {"That", "Foo"}}; - IDictionary actual = MethodNameParser.ParseFromMethodName(methodName, expected); + var expected = new ReadOnlyDictionary(new Dictionary { {"This", 1}, {"That", "Foo"}}); + var actual = MethodNameParser.ParseFromMethodName(methodName, expected); ListHelper.AssertAreEqual(expected, actual); } diff --git a/Simple.Data/Adapter.cs b/Simple.Data/Adapter.cs index e6b622a2..1ead220c 100644 --- a/Simple.Data/Adapter.cs +++ b/Simple.Data/Adapter.cs @@ -1,310 +1,135 @@ -using Simple.Data.Operations; - -namespace Simple.Data -{ - using System; - using System.Collections.Generic; - using System.Collections.ObjectModel; - using System.Dynamic; - using System.Linq; - using Extensions; - - /// - /// Provides a base class for adapters to persist data to data storage systems. - /// Authors may derive from this class to create support for all kinds of databases or data stores. - /// - public abstract class Adapter - { - private readonly ExpandoObject _settings = new ExpandoObject(); - - /// - /// Gets an with the settings for this . - /// This property may be cast to an with a - /// key and value for non-dynamic access. - /// - /// The settings. - protected dynamic Settings - { - get { return _settings; } - } - - /// - /// Performs initial setup of the Adapter, allowing an object to be passed in with Adapter-specific settings. - /// - /// An or an anonymous-typed object with any adapter-specific settings. - public void Setup(object settings) - { - Setup(settings.ObjectToDictionary()); - } - - /// - /// Performs initial setup of the Adapter, allowing an object to be passed in with Adapter-specific settings. - /// - /// A list of name/value pairs with any adapter-specific settings. - public void Setup(IEnumerable> settings) - { - var settingsAsDictionary = (IDictionary) _settings; - foreach (var keyValuePair in settings) - { - settingsAsDictionary.Add(keyValuePair); - } - - OnSetup(); - } - - public OptionsBase Options { get; set; } - - /// - /// Called when the method is called, after the settings have been set. - /// - /// It is not necessary to call base.OnSetup() when overriding this method. - protected virtual void OnSetup() - { - } - - /// - /// Gets the key value(s) for the record. - /// - /// Name of the table. - /// The record. - /// An IDictionary<string,object> containing the key that uniquely identifies the record in the database. - public abstract IReadOnlyDictionary GetKey(string tableName, IReadOnlyDictionary record); - - /// - /// Gets the key name(s) for the table. - /// - /// Name of the table. - /// An IList<string> containing the key names that uniquely identify a record in the database. - public abstract IList GetKeyNames(string tableName); - - /// - /// Gets a single record from the specified "table" using its default key. - /// - /// Operation object with details of operation. - /// The record matching the supplied key. If no record is found, return null. - public abstract IReadOnlyDictionary Get(GetOperation operation); - - /// - /// Finds data from the specified "table". - /// - /// Operation details. - /// The list of records matching the criteria. If no records are found, return an empty list. - public abstract IEnumerable> Find(FindOperation operation); - - /// - /// Runs a . - /// - /// The to run. - /// Use this to return any clauses your adapter is unable to interpret. - /// - public abstract IEnumerable> RunQuery(SimpleQuery query, - out IEnumerable - unhandledClauses); - - /// - /// Inserts a record into the specified "table". - /// - /// Operation details. - /// If possible and required, return the newly inserted row(s), including any automatically-set values such as primary keys or timestamps. - public abstract IEnumerable> Insert(InsertOperation operation); - - /// - /// Updates the specified "table" according to specified criteria. - /// - /// Name of the table. - /// The new values. - /// The expression to use as criteria for the update operation. - /// The number of records affected by the update operation. - public abstract int Update(string tableName, IReadOnlyDictionary data, SimpleExpression criteria); - - /// - /// Deletes from the specified table. - /// Name of the table. - /// The expression to use as criteria for the delete operation. - /// The number of records which were deleted. - public abstract int Delete(string tableName, SimpleExpression criteria); - - /// - /// Checks to see whether the passed function name is a valid function for the Adapter. - /// - /// The name of the function. - /// The values passed (for overload resolution etc). - /// true if the name represents a function; otherwise, false. - public abstract bool IsExpressionFunction(string functionName, params object[] args); - - /// - /// Finds a single record. - /// - /// Operation details. - /// A dictionary containing the record. - /// This method has a default implementation based on the method. - /// You should override this method if your adapter can optimize the operation. - public virtual IReadOnlyDictionary FindOne(FindOperation operation) - { - return Find(operation).FirstOrDefault(); - } - - /// - /// Updates multiple records in a table. - /// - /// Name of the table. - /// The data. - /// The total number of records affected by the update operations. - /// This method has a default implementation based on the method. - /// You should override this method if your adapter can optimize the operation. - public virtual int UpdateMany(string tableName, IEnumerable> data) - { - int updateCount = 0; - foreach (var row in data) - { - var key = GetKey(tableName, row); - var criteria = ExpressionHelper.CriteriaDictionaryToExpression(tableName, key); - updateCount += Update(tableName, row, criteria); - } - return updateCount; - } - - /// - /// Runs the query as an , for Reactive Extension joy. - /// - /// The query. - /// The unhandled clauses. - /// A cold which will start pushing when subscribed. - /// This method has a default implementation based on the method. - /// You should override this method if your adapter can optimize the operation. - public virtual IObservable> RunQueryAsObservable(SimpleQuery query, - out - IEnumerable - - unhandledClauses) - { - return RunQuery(query, out unhandledClauses).ToObservable(); - } - - /// - /// Runs multiple queries. - /// - /// The queries. - /// The unhandled clauses. - /// A list of lists of dictionaries. Data. - /// This method has a default implementation based on the method. - /// You should override this method if your adapter can optimize the operation. - public virtual IEnumerable>> RunQueries(SimpleQuery[] queries, - List - < - IEnumerable - > - unhandledClauses) - { - foreach (var query in queries) - { - IEnumerable unhandledClausesForThisQuery; - var result = RunQuery(query, out unhandledClausesForThisQuery); - unhandledClauses.Add(unhandledClausesForThisQuery); - yield return result; - } - } - - /// - /// Updates the specified "table" according to default keys (to be handled by adapter). - /// - /// Name of the table. - /// A list of objects to be updated. - /// The list of field names to be used for criteria. - /// The number of records affected by the update operation. - /// For example, the Ado adapter will fulfil this functionality using Primary Key data. - /// This method has a default implementation based on the - /// method. - /// You should override this method if your adapter can optimize the operation. - public virtual int UpdateMany(string tableName, IEnumerable> dataList, - IEnumerable criteriaFieldNames) - { - int updatedCount = 0; - var criteriaFieldNameList = criteriaFieldNames.ToList(); - foreach (var data in dataList) - { - var modified = data; - var criteria = GetCriteria(tableName, criteriaFieldNameList, ref modified); - updatedCount += Update(tableName, modified, criteria); - } - return updatedCount; - } - - /// - /// Creates a delegate which can accept an array of values to use as criteria against a cached template. - /// When called, the delegate should return a single record using the passed values as criteria. - /// Name of the table. - /// The criteria to use as a template for the delegate - /// A Func<object[], IDictionary<string, object>>" which finds a record. - public virtual Func> CreateFindOneDelegate(string tableName, - SimpleExpression criteria) - { - throw new NotImplementedException(); - } - - /// - /// Creates a delegate which can accept an array of values to use as criteria against a cached template. - /// When called, the delegate should return zero or more records using the passed values as criteria. - /// Name of the table. - /// The criteria to use as a template for the delegate - /// A Func<object[], IDictionary<string, object>>" which finds a record. - public virtual Func>> CreateFindDelegate(string tableName, - SimpleExpression - criteria) - { - throw new NotImplementedException(); - } - - /// - /// Creates a criteria expression. - /// - /// The name of the root table for the expression. - /// The names of fields to be used for the criteria. - /// The name/value pairs to be used as criteria. - /// A criteria object. - protected static SimpleExpression GetCriteria(string tableName, IEnumerable criteriaFieldNames, - ref IReadOnlyDictionary record) - { - var criteria = new Dictionary(); - var data = record.ToDictionary(); - - foreach (var criteriaFieldName in criteriaFieldNames) - { - var name = criteriaFieldName; - var keyValuePair = record.SingleOrDefault(kvp => kvp.Key.Homogenize().Equals(name.Homogenize())); - if (string.IsNullOrWhiteSpace(keyValuePair.Key)) - { - throw new InvalidOperationException("Key field value not set."); - } - - criteria.Add(criteriaFieldName, keyValuePair.Value); - data.Remove(keyValuePair); - } - record = new ReadOnlyDictionary(data); - return ExpressionHelper.CriteriaDictionaryToExpression(tableName, criteria); - } - - public void Reset() - { - OnReset(); - } - - protected virtual void OnReset() - { - } - - private OptimizingDelegateFactory _optimizingDelegateFactory; - - public OptimizingDelegateFactory OptimizingDelegateFactory - { - get { return _optimizingDelegateFactory ?? (_optimizingDelegateFactory = CreateOptimizingDelegateFactory()); } - } - - private OptimizingDelegateFactory CreateOptimizingDelegateFactory() - { - return MefHelper.GetAdjacentComponent(GetType()) ?? new DefaultOptimizingDelegateFactory(); - } - - public abstract IEnumerable> Upsert(UpsertOperation operation); - } +using Simple.Data.Operations; + +namespace Simple.Data +{ + using System; + using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.Dynamic; + using System.Linq; + using Extensions; + + /// + /// Provides a base class for adapters to persist data to data storage systems. + /// Authors may derive from this class to create support for all kinds of databases or data stores. + /// + public abstract class Adapter + { + private readonly ExpandoObject _settings = new ExpandoObject(); + + /// + /// Gets an with the settings for this . + /// This property may be cast to an with a + /// key and value for non-dynamic access. + /// + /// The settings. + protected dynamic Settings + { + get { return _settings; } + } + + /// + /// Performs initial setup of the Adapter, allowing an object to be passed in with Adapter-specific settings. + /// + /// An or an anonymous-typed object with any adapter-specific settings. + public void Setup(object settings) + { + Setup(settings.ObjectToDictionary()); + } + + /// + /// Performs initial setup of the Adapter, allowing an object to be passed in with Adapter-specific settings. + /// + /// A list of name/value pairs with any adapter-specific settings. + public void Setup(IEnumerable> settings) + { + var settingsAsDictionary = (IDictionary) _settings; + foreach (var keyValuePair in settings) + { + settingsAsDictionary.Add(keyValuePair); + } + + OnSetup(); + } + + public OptionsBase Options { get; set; } + + /// + /// Called when the method is called, after the settings have been set. + /// + /// It is not necessary to call base.OnSetup() when overriding this method. + protected virtual void OnSetup() + { + } + + public abstract IEqualityComparer KeyComparer { get; } + + /// + /// Gets the key value(s) for the record. + /// + /// Name of the table. + /// The record. + /// An IDictionary<string,object> containing the key that uniquely identifies the record in the database. + public abstract IReadOnlyDictionary GetKey(string tableName, IReadOnlyDictionary record); + + /// + /// Gets the key name(s) for the table. + /// + /// Name of the table. + /// An IList<string> containing the key names that uniquely identify a record in the database. + public abstract IList GetKeyNames(string tableName); + + public abstract OperationResult Execute(IOperation operation); + + /// + /// Checks to see whether the passed function name is a valid function for the Adapter. + /// + /// The name of the function. + /// The values passed (for overload resolution etc). + /// true if the name represents a function; otherwise, false. + public abstract bool IsExpressionFunction(string functionName, params object[] args); + + /// + /// Creates a criteria expression. + /// + /// The name of the root table for the expression. + /// The names of fields to be used for the criteria. + /// The name/value pairs to be used as criteria. + /// A criteria object. + protected static SimpleExpression GetCriteria(string tableName, IEnumerable criteriaFieldNames, + ref IReadOnlyDictionary record) + { + var criteria = new Dictionary(); + var data = record.ToDictionary(); + + foreach (var criteriaFieldName in criteriaFieldNames) + { + var name = criteriaFieldName; + var keyValuePair = record.SingleOrDefault(kvp => kvp.Key.Homogenize().Equals(name.Homogenize())); + if (string.IsNullOrWhiteSpace(keyValuePair.Key)) + { + throw new InvalidOperationException("Key field value not set."); + } + + criteria.Add(criteriaFieldName, keyValuePair.Value); + data.Remove(keyValuePair); + } + record = new ReadOnlyDictionary(data); + return ExpressionHelper.CriteriaDictionaryToExpression(tableName, criteria); + } + + public void Reset() + { + OnReset(); + } + + protected virtual void OnReset() + { + } + + public virtual bool IsValidFunction(string functionName) + { + return false; + } + } } \ No newline at end of file diff --git a/Simple.Data/CommandResult.cs b/Simple.Data/CommandResult.cs new file mode 100644 index 00000000..da892bf8 --- /dev/null +++ b/Simple.Data/CommandResult.cs @@ -0,0 +1,17 @@ +namespace Simple.Data +{ + public sealed class CommandResult : OperationResult + { + private readonly int _rowsAffected; + + public int RowsAffected + { + get { return _rowsAffected; } + } + + public CommandResult(int rowsAffected) : base(0) + { + _rowsAffected = rowsAffected; + } + } +} \ No newline at end of file diff --git a/Simple.Data/Commands/DeleteAllCommand.cs b/Simple.Data/Commands/DeleteAllCommand.cs index 856c4a2f..7032b767 100644 --- a/Simple.Data/Commands/DeleteAllCommand.cs +++ b/Simple.Data/Commands/DeleteAllCommand.cs @@ -4,6 +4,8 @@ namespace Simple.Data.Commands { + using Operations; + class DeleteAllCommand : ICommand { public bool IsCommandFor(string method) @@ -13,19 +15,22 @@ public bool IsCommandFor(string method) public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) { - var deletedCount = 0; + OperationResult result; if (args.Length == 0) { - deletedCount = dataStrategy.Run.Delete(table.GetQualifiedName(), new SimpleEmptyExpression()); + result = dataStrategy.Run.Execute(new DeleteOperation(table.GetQualifiedName(), new SimpleEmptyExpression())); } - - if (args.Length == 1 && args[0] is SimpleExpression) + else if (args.Length == 1 && args[0] is SimpleExpression) + { + result = dataStrategy.Run.Execute(new DeleteOperation(table.GetQualifiedName(), (SimpleExpression)args[0])); + } + else { - deletedCount = dataStrategy.Run.Delete(table.GetQualifiedName(), (SimpleExpression)args[0]); + throw new InvalidOperationException(); } - return deletedCount.ResultSetFromModifiedRowCount(); + return ((CommandResult)result).RowsAffected.ResultSetFromModifiedRowCount(); } } } diff --git a/Simple.Data/Commands/DeleteByCommand.cs b/Simple.Data/Commands/DeleteByCommand.cs index abbec91d..abfbb46d 100644 --- a/Simple.Data/Commands/DeleteByCommand.cs +++ b/Simple.Data/Commands/DeleteByCommand.cs @@ -1,43 +1,44 @@ -using System; -using System.Collections.Generic; -using System.Dynamic; - -namespace Simple.Data.Commands -{ - using Extensions; - - class DeleteByCommand : ICommand - { - public bool IsCommandFor(string method) - { - return method.Equals("delete", StringComparison.InvariantCultureIgnoreCase) || method.StartsWith("deleteby", StringComparison.InvariantCultureIgnoreCase); - } - - public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) - { - SimpleExpression criteriaExpression = GetCriteriaExpression(binder, args, table); - return dataStrategy.Run.Delete(table.GetQualifiedName(), criteriaExpression); - } - - private static SimpleExpression GetCriteriaExpression(InvokeMemberBinder binder, object[] args, DynamicTable table) - { - IReadOnlyDictionary criteria; - if (binder.Name.Equals("delete", StringComparison.InvariantCultureIgnoreCase)) - { - criteria = binder.NamedArgumentsToDictionary(args); - if (criteria.Count == 0 && args.Length == 1) - { - criteria = args[0] as IReadOnlyDictionary ?? args[0].ObjectToDictionary(); - } - } - else - { - criteria = MethodNameParser.ParseFromBinder(binder, args); - } - - if (criteria.Count == 0) throw new InvalidOperationException("No criteria specified for Delete. To delete all data, use DeleteAll()."); - - return ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), criteria); - } - } -} +using System; +using System.Collections.Generic; +using System.Dynamic; + +namespace Simple.Data.Commands +{ + using Extensions; + using Operations; + + class DeleteByCommand : ICommand + { + public bool IsCommandFor(string method) + { + return method.Equals("delete", StringComparison.InvariantCultureIgnoreCase) || method.StartsWith("deleteby", StringComparison.InvariantCultureIgnoreCase); + } + + public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) + { + SimpleExpression criteriaExpression = GetCriteriaExpression(binder, args, table); + return dataStrategy.Run.Execute(new DeleteOperation(table.GetQualifiedName(), criteriaExpression)); + } + + private static SimpleExpression GetCriteriaExpression(InvokeMemberBinder binder, object[] args, DynamicTable table) + { + IReadOnlyDictionary criteria; + if (binder.Name.Equals("delete", StringComparison.InvariantCultureIgnoreCase)) + { + criteria = binder.NamedArgumentsToDictionary(args); + if (criteria.Count == 0 && args.Length == 1) + { + criteria = args[0] as IReadOnlyDictionary ?? args[0].ObjectToDictionary(); + } + } + else + { + criteria = MethodNameParser.ParseFromBinder(binder, args); + } + + if (criteria.Count == 0) throw new InvalidOperationException("No criteria specified for Delete. To delete all data, use DeleteAll()."); + + return ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), criteria); + } + } +} diff --git a/Simple.Data/Commands/ExecuteFunctionCommand.cs b/Simple.Data/Commands/ExecuteFunctionCommand.cs index e089dea3..98d06cc4 100644 --- a/Simple.Data/Commands/ExecuteFunctionCommand.cs +++ b/Simple.Data/Commands/ExecuteFunctionCommand.cs @@ -1,53 +1,64 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Text; -using Simple.Data.Extensions; - -namespace Simple.Data.Commands -{ - public class ExecuteFunctionCommand - { - private readonly DataStrategy _database; - private readonly IAdapterWithFunctions _adapter; - private readonly string _functionName; - private readonly IReadOnlyDictionary _arguments; - - public ExecuteFunctionCommand(DataStrategy database, IAdapterWithFunctions adapter, string functionName, IReadOnlyDictionary arguments) - { - _database = database; - _adapter = adapter; - _functionName = functionName; - _arguments = arguments; - } - - public bool Execute(out object result) - { - result = ToMultipleResultSets(_adapter.Execute(_functionName, _arguments)); - return true; - } - - private SimpleResultSet ToMultipleResultSets(object source) - { - if (source == null) return SimpleResultSet.Empty; - var resultSets = source as IEnumerable>>; - if (resultSets == null) throw new InvalidOperationException("Adapter returned incorrect Type."); - - return ToMultipleDynamicEnumerables(resultSets); - } - - private SimpleResultSet ToMultipleDynamicEnumerables(IEnumerable>> resultSets) - { - var result = new SimpleResultSet(resultSets.Select(resultSet => resultSet.Select(dict => new SimpleRecord(dict)))); - result.SetOutputValues(_arguments); - return result; - } - - public bool Execute(out object result, IAdapterTransaction adapterTransaction) - { - result = ToMultipleResultSets(_adapter.Execute(_functionName, _arguments, adapterTransaction)); - return true; - } - } -} +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using Simple.Data.Extensions; + +namespace Simple.Data.Commands +{ + using Operations; + + public class ExecuteFunctionCommand + { + private readonly DataStrategy _database; + private readonly Adapter _adapter; + private readonly string _functionName; + private readonly IReadOnlyDictionary _arguments; + + public ExecuteFunctionCommand(DataStrategy database, Adapter adapter, string functionName, IReadOnlyDictionary arguments) + { + _database = database; + _adapter = adapter; + _functionName = functionName; + _arguments = arguments; + } + + public bool Execute(out object result) + { + result = ToMultipleResultSets(_adapter.Execute(new FunctionOperation(_functionName, _arguments))); + return true; + } + + private SimpleResultSet ToMultipleResultSets(object source) + { + if (source == null) return SimpleResultSet.Empty; + var resultSets = source as IEnumerable>>; + if (resultSets == null) throw new InvalidOperationException("Adapter returned incorrect Type."); + + return ToMultipleDynamicEnumerables(resultSets); + } + + private SimpleResultSet ToMultipleDynamicEnumerables(IEnumerable>> resultSets) + { + var result = new SimpleResultSet(resultSets.Select(resultSet => resultSet.Select(dict => new SimpleRecord(dict)))); + result.SetOutputValues(_arguments); + return result; + } + + public bool Execute(out object result, IAdapterTransaction adapterTransaction) + { + var adapterWithTransactions = _adapter as IAdapterWithTransactions; + if (adapterWithTransactions != null) + { + result = + ToMultipleResultSets(adapterWithTransactions.Execute(new FunctionOperation(_functionName, _arguments), + adapterTransaction)); + return true; + } + + result = null; + return false; + } + } +} diff --git a/Simple.Data/Commands/FindByCommand.cs b/Simple.Data/Commands/FindByCommand.cs index 08d7ac45..f80b373f 100644 --- a/Simple.Data/Commands/FindByCommand.cs +++ b/Simple.Data/Commands/FindByCommand.cs @@ -1,93 +1,65 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Dynamic; -using System.Linq; -using Simple.Data.Operations; - -namespace Simple.Data.Commands -{ - using System.Reflection; - using Extensions; - - class FindByCommand : ICommand, ICreateDelegate, IQueryCompatibleCommand - { - public bool IsCommandFor(string method) - { - return method.StartsWith("FindBy") || method.StartsWith("find_by_", StringComparison.InvariantCultureIgnoreCase); - } - - public Func CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) - { - if (dataStrategy is SimpleTransaction) return null; - - if (binder.Name.Equals("FindBy") || binder.Name.Equals("find_by")) - { - ArgumentHelper.CheckFindArgs(args, binder); - if (args.Length == 1 && args[0].IsAnonymous()) return null; - } - - var criteriaDictionary = ArgumentHelper.CreateCriteriaDictionary(binder, args, "FindBy", "find_by"); - if (criteriaDictionary == null) return null; - - var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), criteriaDictionary); - try - { - var adapter = dataStrategy.GetAdapter(); - var func = adapter.OptimizingDelegateFactory.CreateFindOneDelegate(adapter, table.GetQualifiedName(), criteriaExpression); - return a => - { - var data = func(a); - return (data != null && data.Count > 0) - ? new SimpleRecord(data, table.GetQualifiedName(), dataStrategy) - : null; - }; - } - catch (NotImplementedException) - { - return null; - } - } - - private static IEnumerable> CreateCriteriaDictionary(InvokeMemberBinder binder, IList args) - { - IReadOnlyDictionary criteriaDictionary = null; - if (binder.Name.Equals("FindBy") || binder.Name.Equals("find_by")) - { - if (args.Count == 0) throw new ArgumentException("FindBy requires arguments."); - if (binder.CallInfo.ArgumentNames != null && binder.CallInfo.ArgumentNames.Count > 0) - { - criteriaDictionary = binder.NamedArgumentsToDictionary(args); - } - else if (args.Count == 1) - { - if (ReferenceEquals(args[0], null)) throw new ArgumentException("FindBy does not accept unnamed null argument."); - criteriaDictionary = args[0].ObjectToDictionary(); - } - } - else - { - criteriaDictionary = MethodNameParser.ParseFromBinder(binder, args); - } - return criteriaDictionary; - } - - public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) - { - var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), - CreateCriteriaDictionary(binder, - args)); - var data = dataStrategy.Run.FindOne(new FindOperation(table.GetQualifiedName(), criteriaExpression)); - return data != null ? new SimpleRecord(data, table.GetQualifiedName(), dataStrategy) : null; - } - - public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args) - { - var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(query.TableName, - CreateCriteriaDictionary(binder, - args)); - query = query.Where(criteriaExpression).Take(1); - return query.FirstOrDefault(); - } - } -} +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using Simple.Data.Operations; + +namespace Simple.Data.Commands +{ + using System.Reflection; + using Extensions; + + class FindByCommand : ICommand, ICreateDelegate, IQueryCompatibleCommand + { + public bool IsCommandFor(string method) + { + return method.StartsWith("FindBy") || method.StartsWith("find_by_", StringComparison.InvariantCultureIgnoreCase); + } + + public Func CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) + { + return null; + } + + private static IEnumerable> CreateCriteriaDictionary(InvokeMemberBinder binder, IList args) + { + IReadOnlyDictionary criteriaDictionary = null; + if (binder.Name.Equals("FindBy") || binder.Name.Equals("find_by")) + { + if (args.Count == 0) throw new ArgumentException("FindBy requires arguments."); + if (binder.CallInfo.ArgumentNames != null && binder.CallInfo.ArgumentNames.Count > 0) + { + criteriaDictionary = binder.NamedArgumentsToDictionary(args); + } + else if (args.Count == 1) + { + if (ReferenceEquals(args[0], null)) throw new ArgumentException("FindBy does not accept unnamed null argument."); + criteriaDictionary = args[0].ObjectToDictionary(); + } + } + else + { + criteriaDictionary = MethodNameParser.ParseFromBinder(binder, args); + } + return criteriaDictionary; + } + + public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) + { + var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), + CreateCriteriaDictionary(binder, + args)); + return dataStrategy.Run.Execute(new QueryOperation(dataStrategy, table.GetQualifiedName(), criteriaExpression)); + } + + public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args) + { + var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(query.TableName, + CreateCriteriaDictionary(binder, + args)); + query = query.Where(criteriaExpression).Take(1); + return query.FirstOrDefault(); + } + } +} diff --git a/Simple.Data/Commands/FindCommand.cs b/Simple.Data/Commands/FindCommand.cs index 74b690b9..e09cf746 100644 --- a/Simple.Data/Commands/FindCommand.cs +++ b/Simple.Data/Commands/FindCommand.cs @@ -1,48 +1,49 @@ -using System; -using System.Collections.Generic; -using System.Dynamic; -using System.Linq; -using System.Text; -using Simple.Data.Operations; - -namespace Simple.Data.Commands -{ - class FindCommand : ICommand, IQueryCompatibleCommand - { - /// - /// Determines whether the instance is able to handle the specified method. - /// - /// The method name. - /// - /// true if the instance is able to handle the specified method; otherwise, false. - /// - public bool IsCommandFor(string method) - { - return method.Equals("find", StringComparison.InvariantCultureIgnoreCase); - } - - /// - /// Executes the command. - /// - /// The database (or transaction) - /// - /// The binder from the method invocation. - /// The arguments from the method invocation. - /// - public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) - { - if (args.Length == 1 && args[0] is SimpleExpression) - { - var data = dataStrategy.Run.FindOne(new FindOperation(table.GetQualifiedName(), (SimpleExpression)args[0])); - return data != null ? new SimpleRecord(data, table.GetQualifiedName(), dataStrategy) : null; - } - - throw new BadExpressionException("Find only accepts a criteria expression."); - } - - public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args) - { - return query.Where((SimpleExpression) args[0]).Take(1).FirstOrDefault(); - } - } -} +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Text; +using Simple.Data.Operations; + +namespace Simple.Data.Commands +{ + class FindCommand : ICommand, IQueryCompatibleCommand + { + /// + /// Determines whether the instance is able to handle the specified method. + /// + /// The method name. + /// + /// true if the instance is able to handle the specified method; otherwise, false. + /// + public bool IsCommandFor(string method) + { + return method.Equals("find", StringComparison.InvariantCultureIgnoreCase); + } + + /// + /// Executes the command. + /// + /// The database (or transaction) + /// + /// The binder from the method invocation. + /// The arguments from the method invocation. + /// + public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) + { + if (args.Length == 1 && args[0] is SimpleExpression) + { + var result = (DataResult)dataStrategy.Run.Execute(new QueryOperation(dataStrategy, table.GetQualifiedName(), (SimpleExpression)args[0])); + var data = result.Data.FirstOrDefault(); + return data != null ? new SimpleRecord(data, table.GetQualifiedName(), dataStrategy) : null; + } + + throw new BadExpressionException("Find only accepts a criteria expression."); + } + + public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args) + { + return query.Where((SimpleExpression) args[0]).Take(1).FirstOrDefault(); + } + } +} diff --git a/Simple.Data/Commands/GetCommand.cs b/Simple.Data/Commands/GetCommand.cs index 492db51b..0c709949 100644 --- a/Simple.Data/Commands/GetCommand.cs +++ b/Simple.Data/Commands/GetCommand.cs @@ -1,53 +1,45 @@ -using System; -using System.Collections.Generic; -using System.Dynamic; -using System.Linq; -using System.Text; -using Simple.Data.Operations; - -namespace Simple.Data.Commands -{ - using Extensions; - - public class GetCommand : ICommand, ICreateDelegate, IQueryCompatibleCommand - { - public bool IsCommandFor(string method) - { - return method.Equals("get", StringComparison.OrdinalIgnoreCase) || method.Equals("getscalar", StringComparison.OrdinalIgnoreCase); - } - - public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) - { - var result = dataStrategy.Run.Get(new GetOperation(table.GetName(), args)); - if (result == null || result.Count == 0) return null; - return binder.Name.Equals("get", StringComparison.OrdinalIgnoreCase) - ? new SimpleRecord(result, table.GetQualifiedName(), dataStrategy) - : result.First().Value; - } - - public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args) - { - var keyNames = dataStrategy.GetAdapter().GetKeyNames(query.TableName); - var dict = keyNames.Select((k, i) => new KeyValuePair(k, args[i])); - query = query.Where(ExpressionHelper.CriteriaDictionaryToExpression(query.TableName, dict)).Take(1); - var result = query.FirstOrDefault(); - if (result == null) return null; - return binder.Name.Equals("get", StringComparison.OrdinalIgnoreCase) ? result : ((IDictionary) result).First().Value; - } - - public Func CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) - { - if (dataStrategy is SimpleTransaction) return null; - - var func = dataStrategy.GetAdapter().OptimizingDelegateFactory.CreateGetDelegate(dataStrategy.GetAdapter(), - new GetOperation(table.GetQualifiedName(), args)); - return a => - { - var data = func(a); - return (data != null && data.Count > 0) - ? new SimpleRecord(data, table.GetQualifiedName(), dataStrategy) - : null; - }; - } - } -} +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Text; +using Simple.Data.Operations; + +namespace Simple.Data.Commands +{ + using Extensions; + + public class GetCommand : ICommand, ICreateDelegate, IQueryCompatibleCommand + { + public bool IsCommandFor(string method) + { + return method.Equals("get", StringComparison.OrdinalIgnoreCase) || method.Equals("getscalar", StringComparison.OrdinalIgnoreCase); + } + + public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) + { + var result = (DataResult)dataStrategy.Run.Execute(new GetOperation(table.GetName(), args)); + if (result == null) return null; + var record = result.Data.FirstOrDefault(); + if (record == null) return null; + return binder.Name.Equals("get", StringComparison.OrdinalIgnoreCase) + ? new SimpleRecord(record, table.GetQualifiedName(), dataStrategy) + : record.First().Value; + } + + public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args) + { + var keyNames = dataStrategy.GetAdapter().GetKeyNames(query.TableName); + var dict = keyNames.Select((k, i) => new KeyValuePair(k, args[i])); + query = query.Where(ExpressionHelper.CriteriaDictionaryToExpression(query.TableName, dict)).Take(1); + var result = query.FirstOrDefault(); + if (result == null) return null; + return binder.Name.Equals("get", StringComparison.OrdinalIgnoreCase) ? result : ((IDictionary) result).First().Value; + } + + public Func CreateDelegate(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) + { + return null; + } + } +} diff --git a/Simple.Data/Commands/InsertCommand.cs b/Simple.Data/Commands/InsertCommand.cs index 4cbd873b..56ff6c58 100644 --- a/Simple.Data/Commands/InsertCommand.cs +++ b/Simple.Data/Commands/InsertCommand.cs @@ -1,92 +1,92 @@ -using System; -using System.Collections.Generic; -using System.Dynamic; -using System.Linq; -using System.Linq.Expressions; -using Simple.Data.Extensions; - -namespace Simple.Data.Commands -{ - using System.Collections; - using System.Collections.ObjectModel; - using Operations; - - class InsertCommand : ICommand - { - public bool IsCommandFor(string method) - { - return method.Equals("insert", StringComparison.InvariantCultureIgnoreCase); - } - - public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) - { - var result = DoInsert(binder, args, dataStrategy, table.GetQualifiedName()); - - return ResultHelper.TypeResult(result, table, dataStrategy); - } - - private static object DoInsert(InvokeMemberBinder binder, object[] args, DataStrategy dataStrategy, string tableName) - { - if (binder.HasSingleUnnamedArgument()) - { - return InsertEntity(args[0], dataStrategy, tableName, (r,e) => false, !binder.IsResultDiscarded()); - } - - if (args.Length == 2) - { - var onError = args[1] as ErrorCallback; - if (onError != null) - { - return InsertEntity(args[0], dataStrategy, tableName, onError, !binder.IsResultDiscarded()); - } - } - return InsertDictionary(binder, args, dataStrategy, tableName); - } - - private static object InsertDictionary(InvokeMemberBinder binder, IEnumerable args, DataStrategy dataStrategy, string tableName) - { - var operation = new InsertOperation(tableName, Enumerable.Repeat(binder.NamedArgumentsToDictionary(args), 1), - !binder.IsResultDiscarded()); - return dataStrategy.Run.Insert(operation); - } - - private static IEnumerable> InsertEntity(object entity, DataStrategy dataStrategy, string tableName, ErrorCallback onError, bool resultRequired) - { - var readOnlyDictionary = entity as IReadOnlyDictionary; - if (readOnlyDictionary != null) - { - var operation = new InsertOperation(tableName, readOnlyDictionary, resultRequired); - return dataStrategy.Run.Insert(operation); - } - - var list = entity as IEnumerable>; - if (list != null) - { - return dataStrategy.Run.Insert(new InsertOperation(tableName, list, resultRequired, onError)); - } - - var entityList = entity as IEnumerable; - if (entityList != null) - { - var array = entityList.Cast().ToArray(); - var rows = new List>(); - foreach (var o in array) - { - readOnlyDictionary = (o as IReadOnlyDictionary) ?? o.ObjectToDictionary(); - if (readOnlyDictionary.Count == 0) - { - throw new SimpleDataException("Could not discover data in object."); - } - rows.Add(readOnlyDictionary); - } - - return dataStrategy.Run.Insert(new InsertOperation(tableName, rows, resultRequired, onError)); - } - - readOnlyDictionary = entity.ObjectToDictionary(); - if (readOnlyDictionary.Count == 0) - throw new SimpleDataException("Could not discover data in object."); - return dataStrategy.Run.Insert(new InsertOperation(tableName, readOnlyDictionary, resultRequired)); - } - } -} +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Linq.Expressions; +using Simple.Data.Extensions; + +namespace Simple.Data.Commands +{ + using System.Collections; + using System.Collections.ObjectModel; + using Operations; + + class InsertCommand : ICommand + { + public bool IsCommandFor(string method) + { + return method.Equals("insert", StringComparison.InvariantCultureIgnoreCase); + } + + public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) + { + var result = DoInsert(binder, args, dataStrategy, table.GetQualifiedName()); + + return ResultHelper.TypeResult(result, table, dataStrategy); + } + + private static object DoInsert(InvokeMemberBinder binder, object[] args, DataStrategy dataStrategy, string tableName) + { + if (binder.HasSingleUnnamedArgument()) + { + return InsertEntity(args[0], dataStrategy, tableName, (r,e) => false, !binder.IsResultDiscarded()); + } + + if (args.Length == 2) + { + var onError = args[1] as ErrorCallback; + if (onError != null) + { + return InsertEntity(args[0], dataStrategy, tableName, onError, !binder.IsResultDiscarded()); + } + } + return InsertDictionary(binder, args, dataStrategy, tableName); + } + + private static DataResult InsertDictionary(InvokeMemberBinder binder, IEnumerable args, DataStrategy dataStrategy, string tableName) + { + var operation = new InsertOperation(tableName, Enumerable.Repeat(binder.NamedArgumentsToDictionary(args), 1), + !binder.IsResultDiscarded()); + return (DataResult)dataStrategy.Run.Execute(operation); + } + + private static DataResult InsertEntity(object entity, DataStrategy dataStrategy, string tableName, ErrorCallback onError, bool resultRequired) + { + var readOnlyDictionary = entity as IReadOnlyDictionary; + if (readOnlyDictionary != null) + { + var operation = new InsertOperation(tableName, readOnlyDictionary, resultRequired); + return (DataResult)dataStrategy.Run.Execute(operation); + } + + var list = entity as IEnumerable>; + if (list != null) + { + return (DataResult)dataStrategy.Run.Execute(new InsertOperation(tableName, list, resultRequired, onError)); + } + + var entityList = entity as IEnumerable; + if (entityList != null) + { + var array = entityList.Cast().ToArray(); + var rows = new List>(); + foreach (var o in array) + { + readOnlyDictionary = (o as IReadOnlyDictionary) ?? o.ObjectToDictionary(); + if (readOnlyDictionary.Count == 0) + { + throw new SimpleDataException("Could not discover data in object."); + } + rows.Add(readOnlyDictionary); + } + + return (DataResult)dataStrategy.Run.Execute(new InsertOperation(tableName, rows, resultRequired, onError)); + } + + readOnlyDictionary = entity.ObjectToDictionary(); + if (readOnlyDictionary.Count == 0) + throw new SimpleDataException("Could not discover data in object."); + return (DataResult)dataStrategy.Run.Execute(new InsertOperation(tableName, readOnlyDictionary, resultRequired)); + } + } +} diff --git a/Simple.Data/Commands/UpdateAllCommand.cs b/Simple.Data/Commands/UpdateAllCommand.cs index e485743f..87c84a55 100644 --- a/Simple.Data/Commands/UpdateAllCommand.cs +++ b/Simple.Data/Commands/UpdateAllCommand.cs @@ -6,6 +6,7 @@ namespace Simple.Data.Commands { using System.Collections.Generic; + using Operations; class UpdateAllCommand : ICommand { @@ -28,9 +29,9 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe throw new SimpleDataException("Could not resolve data."); } - var updatedCount = dataStrategy.Run.Update(table.GetQualifiedName(), data, criteria); - - return updatedCount.ResultSetFromModifiedRowCount(); + return + dataStrategy.Run.Execute(new UpdateByCriteriaOperation(table.GetQualifiedName(), criteria, + data.ToReadOnly())); } } } diff --git a/Simple.Data/Commands/UpdateByCommand.cs b/Simple.Data/Commands/UpdateByCommand.cs index 3949e839..78bb28a0 100644 --- a/Simple.Data/Commands/UpdateByCommand.cs +++ b/Simple.Data/Commands/UpdateByCommand.cs @@ -6,6 +6,7 @@ namespace Simple.Data.Commands { using System.Collections.Generic; + using Operations; class UpdateByCommand : ICommand { @@ -27,19 +28,17 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe var data = binder.NamedArgumentsToDictionary(args) .Where(kvp => !criteria.ContainsKey(kvp.Key)) .ToDictionary(); - return dataStrategy.Run.Update(table.GetQualifiedName(), data, criteriaExpression); + return dataStrategy.Run.Execute(new UpdateEntityOperation(table.GetQualifiedName(), data.ToReadOnly())); } internal static object UpdateByKeyFields(string tableName, DataStrategy dataStrategy, object entity, IEnumerable keyFieldNames) { var record = UpdateCommand.ObjectToDictionary(entity); - var list = record as IList>; - if (list != null) return dataStrategy.Run.UpdateMany(tableName, list, keyFieldNames); + var list = record as ICollection>; + if (list != null) return dataStrategy.Run.Execute(new UpdateEntityOperation(tableName, list.Select(d => d.ToReadOnly()).ToList())); var dict = record as IDictionary; - var criteria = GetCriteria(keyFieldNames, dict); - var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(tableName, criteria); - return dataStrategy.Run.Update(tableName, dict, criteriaExpression); + return dataStrategy.Run.Execute(new UpdateEntityOperation(tableName, dict.ToReadOnly())); } private static IEnumerable> GetCriteria(IEnumerable keyFieldNames, IDictionary record) diff --git a/Simple.Data/Commands/UpdateCommand.cs b/Simple.Data/Commands/UpdateCommand.cs index 9a2881e4..276f3f07 100644 --- a/Simple.Data/Commands/UpdateCommand.cs +++ b/Simple.Data/Commands/UpdateCommand.cs @@ -9,6 +9,8 @@ namespace Simple.Data.Commands { using System.Collections; + using System.Collections.ObjectModel; + using Operations; internal class UpdateCommand : ICommand { @@ -32,53 +34,52 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe private static object UpdateUsingOriginalValues(DataStrategy dataStrategy, DynamicTable table, object[] args) { var newValues = ObjectToDictionary(args[0]); - var newValuesList = newValues as IList>; + var newValuesList = newValues as IList>; if (newValuesList != null) { - var originalValuesList = ObjectToDictionary(args[1]) as IList>; + var originalValuesList = ObjectToDictionary(args[1]) as IList>; if (originalValuesList == null) throw new InvalidOperationException("Parameter type mismatch; both parameters to Update should be same type."); - return dataStrategy.Run.UpdateMany(table.GetQualifiedName(), newValuesList, originalValuesList); + return dataStrategy.Run.Execute(new UpdateEntityOperation(table.GetQualifiedName(), newValuesList, originalValuesList)); } - var newValuesDict = newValues as IDictionary; - var originalValuesDict = ObjectToDictionary(args[1]) as IDictionary; + var newValuesDict = newValues as IReadOnlyDictionary; + var originalValuesDict = ObjectToDictionary(args[1]) as IReadOnlyDictionary; if (originalValuesDict == null) throw new InvalidOperationException("Parameter type mismatch; both parameters to Update should be same type."); - return dataStrategy.Run.Update(table.GetQualifiedName(), newValuesDict, originalValuesDict); + return dataStrategy.Run.Execute(new UpdateEntityOperation(table.GetQualifiedName(), newValuesDict, originalValuesDict)); } private static object UpdateUsingKeys(DataStrategy dataStrategy, DynamicTable table, object[] args) { var record = ObjectToDictionary(args[0]); - var list = record as IList>; - if (list != null) return dataStrategy.Run.UpdateMany(table.GetQualifiedName(), list); + var list = record as IList>; + if (list != null) return dataStrategy.Run.Execute(new UpdateEntityOperation(table.GetQualifiedName(), list)); - var dict = record as IDictionary; + var dict = record as IReadOnlyDictionary; if (dict == null) throw new InvalidOperationException("Could not resolve data from passed object."); var key = dataStrategy.GetAdapter().GetKey(table.GetQualifiedName(), dict); - dict = dict.Where(kvp => key.All(keyKvp => keyKvp.Key.Homogenize() != kvp.Key.Homogenize())).ToDictionary(); - var criteria = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), key); - return dataStrategy.Run.Update(table.GetQualifiedName(), dict, criteria); + dict = dict.Where(kvp => key.All(keyKvp => keyKvp.Key.Homogenize() != kvp.Key.Homogenize())).ToReadOnlyDictionary(); + return dataStrategy.Run.Execute(new UpdateEntityOperation(table.GetQualifiedName(), dict)); } internal static object ObjectToDictionary(object obj) { - var dynamicRecord = obj as SimpleRecord; - if (dynamicRecord != null) + var readOnlyDictionary = obj as IReadOnlyDictionary; + if (readOnlyDictionary != null) { - return new Dictionary(dynamicRecord, HomogenizedEqualityComparer.DefaultInstance); + return readOnlyDictionary; } var dictionary = obj as IDictionary; if (dictionary != null) { - return new Dictionary(dictionary, HomogenizedEqualityComparer.DefaultInstance); + return dictionary.ToReadOnly(); } var list = obj as IEnumerable; if (list != null) { var originals = list.Cast().ToList(); - var dictionaries = originals.Select(o => ObjectToDictionary(o) as IDictionary).Where(o => o != null && o.Count > 0).ToList(); + var dictionaries = originals.Select(o => ObjectToDictionary(o) as IReadOnlyDictionary).Where(o => o != null && o.Count > 0).ToList(); if (originals.Count == dictionaries.Count) return dictionaries; } diff --git a/Simple.Data/Commands/UpsertByCommand.cs b/Simple.Data/Commands/UpsertByCommand.cs index 68fdbe6b..8a33a160 100644 --- a/Simple.Data/Commands/UpsertByCommand.cs +++ b/Simple.Data/Commands/UpsertByCommand.cs @@ -1,72 +1,79 @@ -namespace Simple.Data.Commands -{ - using System; - using System.Collections.Generic; - using System.Dynamic; - using System.Linq; - using Extensions; - using Operations; - - class UpsertByCommand : ICommand - { - public bool IsCommandFor(string method) - { - return method.Homogenize().StartsWith("upsertby", StringComparison.InvariantCultureIgnoreCase); - } - - public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) - { - object result; - - if (binder.HasSingleUnnamedArgument() || args.Length == 2 && args[1] is ErrorCallback) - { - result = UpsertByKeyFields(table.GetQualifiedName(), dataStrategy, args[0], - MethodNameParser.ParseCriteriaNamesFromMethodName(binder.Name), - !binder.IsResultDiscarded(), - args.Length == 2 ? (ErrorCallback)args[1] : ((item, exception) => false)); - } - else - { - var criteria = MethodNameParser.ParseFromBinder(binder, args); - var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), - criteria); - var data = binder.NamedArgumentsToDictionary(args); - result = dataStrategy.Run.Upsert(table.GetQualifiedName(), data, criteriaExpression, !binder.IsResultDiscarded()); - } - - return ResultHelper.TypeResult(result, table, dataStrategy); - } - - internal static object UpsertByKeyFields(string tableName, DataStrategy dataStrategy, object entity, IEnumerable keyFieldNames, bool isResultRequired, ErrorCallback errorCallback) - { - var record = UpdateCommand.ObjectToDictionary(entity); - var list = record as IList>; - var operation = new UpsertOperation(tableName, list, isResultRequired, keyFieldNames.ToArray(), - errorCallback); - if (list != null) return dataStrategy.Run.Upsert(operation); - - var dict = record as IDictionary; - var criteria = GetCriteria(keyFieldNames, dict); - var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(tableName, criteria); - return dataStrategy.Run.Upsert(tableName, dict, criteriaExpression, isResultRequired); - } - - private static IEnumerable> GetCriteria(IEnumerable keyFieldNames, IDictionary record) - { - var criteria = new Dictionary(); - - foreach (var keyFieldName in keyFieldNames) - { - var name = keyFieldName; - var keyValuePair = record.SingleOrDefault(kvp => kvp.Key.Homogenize().Equals(name.Homogenize())); - if (string.IsNullOrWhiteSpace(keyValuePair.Key)) - { - throw new InvalidOperationException("Key field value not set."); - } - - criteria.Add(keyFieldName, keyValuePair.Value); - } - return criteria; - } - } +namespace Simple.Data.Commands +{ + using System; + using System.Collections.Generic; + using System.Dynamic; + using System.Linq; + using Extensions; + using Operations; + + class UpsertByCommand : ICommand + { + public bool IsCommandFor(string method) + { + return method.Homogenize().StartsWith("upsertby", StringComparison.InvariantCultureIgnoreCase); + } + + public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) + { + object result; + + if (binder.HasSingleUnnamedArgument() || args.Length == 2 && args[1] is ErrorCallback) + { + result = UpsertByKeyFields(table.GetQualifiedName(), dataStrategy, args[0], + MethodNameParser.ParseCriteriaNamesFromMethodName(binder.Name), + !binder.IsResultDiscarded(), + args.Length == 2 ? (ErrorCallback)args[1] : ((item, exception) => false)); + } + else + { + var criteria = MethodNameParser.ParseFromBinder(binder, args); + var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), + criteria); + var data = binder.NamedArgumentsToDictionary(args); + var operation = new UpsertOperation(table.GetQualifiedName(), data, !binder.IsResultDiscarded()); + result = dataStrategy.Run.Execute(operation); + } + + return ResultHelper.TypeResult(result, table, dataStrategy); + } + + internal static object UpsertByKeyFields(string tableName, DataStrategy dataStrategy, object entity, IEnumerable keyFieldNames, bool isResultRequired, ErrorCallback errorCallback) + { + var record = UpdateCommand.ObjectToDictionary(entity); + var list = record as IList>; + if (list != null) + { + var operation = new UpsertOperation(tableName, list, isResultRequired, keyFieldNames.ToArray(), + errorCallback); + return dataStrategy.Run.Execute(operation); + } + else + { + + var dict = record as IDictionary; + var operation = new UpsertOperation(tableName, dict, isResultRequired, keyFieldNames.ToArray(), + errorCallback); + return dataStrategy.Run.Execute(operation); + } + } + + private static IEnumerable> GetCriteria(IEnumerable keyFieldNames, IDictionary record) + { + var criteria = new Dictionary(); + + foreach (var keyFieldName in keyFieldNames) + { + var name = keyFieldName; + var keyValuePair = record.SingleOrDefault(kvp => kvp.Key.Homogenize().Equals(name.Homogenize())); + if (string.IsNullOrWhiteSpace(keyValuePair.Key)) + { + throw new InvalidOperationException("Key field value not set."); + } + + criteria.Add(keyFieldName, keyValuePair.Value); + } + return criteria; + } + } } \ No newline at end of file diff --git a/Simple.Data/Commands/UpsertCommand.cs b/Simple.Data/Commands/UpsertCommand.cs index 9a0be4ac..6b3ff881 100644 --- a/Simple.Data/Commands/UpsertCommand.cs +++ b/Simple.Data/Commands/UpsertCommand.cs @@ -1,85 +1,85 @@ -namespace Simple.Data.Commands -{ - using System; - using System.Collections; - using System.Collections.Generic; - using System.Dynamic; - using System.Linq; - using Extensions; - using Operations; - - internal class UpsertCommand : ICommand - { - public bool IsCommandFor(string method) - { - return method.Equals("upsert", StringComparison.InvariantCultureIgnoreCase); - } - - public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) - { - object[] objects; - if (binder.CallInfo.ArgumentNames.Count > 0 && binder.CallInfo.ArgumentNames.All(s => !string.IsNullOrWhiteSpace(s))) - { - objects = new object[] {binder.NamedArgumentsToDictionary(args)}; - } - else if (args.Length == 0 || args.Length > 2) - { - throw new ArgumentException("Incorrect number of arguments to Upsert method."); - } - else - { - objects = args; - } - - var result = UpsertUsingKeys(dataStrategy, table, objects, !binder.IsResultDiscarded()); - - return ResultHelper.TypeResult(result, table, dataStrategy); - } - - private static object UpsertUsingKeys(DataStrategy dataStrategy, DynamicTable table, object[] args, bool isResultRequired) - { - var record = ObjectToDictionary(args[0]); - var list = record as IList>; - if (list != null) - { - ErrorCallback errorCallback = (args.Length == 2 ? args[1] as ErrorCallback : null) ?? - ((item, exception) => false); - return dataStrategy.Run.Upsert(new UpsertOperation(table.GetQualifiedName(), list, isResultRequired, null, errorCallback)); - } - - var dict = record as IReadOnlyDictionary; - if (dict == null) throw new InvalidOperationException("Could not resolve data from passed object."); - var key = dataStrategy.GetAdapter().GetKey(table.GetQualifiedName(), dict); - if (key == null) throw new InvalidOperationException(string.Format("No key columns defined for table \"{0}\"",table.GetQualifiedName())); - if (key.Count == 0) return dataStrategy.Run.Insert(new InsertOperation(table.GetQualifiedName(), dict, isResultRequired)); - var criteria = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), key); - return dataStrategy.Run.Upsert(new UpsertOperation(table.GetQualifiedName(), dict, isResultRequired)); - } - - internal static object ObjectToDictionary(object obj) - { - var dynamicRecord = obj as SimpleRecord; - if (dynamicRecord != null) - { - return new Dictionary(dynamicRecord, HomogenizedEqualityComparer.DefaultInstance); - } - - var dictionary = obj as IDictionary; - if (dictionary != null) - { - return dictionary; - } - - var list = obj as IEnumerable; - if (list != null) - { - var originals = list.Cast().ToList(); - var dictionaries = originals.Select(o => ObjectToDictionary(o) as IDictionary).Where(o => o != null && o.Count > 0).ToList(); - if (originals.Count == dictionaries.Count) - return dictionaries; - } - - return obj.ObjectToDictionary(); - } - } +namespace Simple.Data.Commands +{ + using System; + using System.Collections; + using System.Collections.Generic; + using System.Dynamic; + using System.Linq; + using Extensions; + using Operations; + + internal class UpsertCommand : ICommand + { + public bool IsCommandFor(string method) + { + return method.Equals("upsert", StringComparison.InvariantCultureIgnoreCase); + } + + public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) + { + object[] objects; + if (binder.CallInfo.ArgumentNames.Count > 0 && binder.CallInfo.ArgumentNames.All(s => !string.IsNullOrWhiteSpace(s))) + { + objects = new object[] {binder.NamedArgumentsToDictionary(args)}; + } + else if (args.Length == 0 || args.Length > 2) + { + throw new ArgumentException("Incorrect number of arguments to Upsert method."); + } + else + { + objects = args; + } + + var result = UpsertUsingKeys(dataStrategy, table, objects, !binder.IsResultDiscarded()); + + return ResultHelper.TypeResult(result, table, dataStrategy); + } + + private static OperationResult UpsertUsingKeys(DataStrategy dataStrategy, DynamicTable table, object[] args, bool isResultRequired) + { + var record = ObjectToDictionary(args[0], dataStrategy.GetAdapter().KeyComparer); + var list = record as IList>; + if (list != null) + { + ErrorCallback errorCallback = (args.Length == 2 ? args[1] as ErrorCallback : null) ?? + ((item, exception) => false); + return dataStrategy.Run.Execute(new UpsertOperation(table.GetQualifiedName(), list, isResultRequired, null, errorCallback)); + } + + var dict = record as IReadOnlyDictionary; + if (dict == null) throw new InvalidOperationException("Could not resolve data from passed object."); + var key = dataStrategy.GetAdapter().GetKey(table.GetQualifiedName(), dict); + if (key == null) throw new InvalidOperationException(string.Format("No key columns defined for table \"{0}\"",table.GetQualifiedName())); + if (key.Count == 0) return dataStrategy.Run.Execute(new InsertOperation(table.GetQualifiedName(), dict, isResultRequired)); + var criteria = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), key); + return dataStrategy.Run.Execute(new UpsertOperation(table.GetQualifiedName(), dict, isResultRequired)); + } + + internal static object ObjectToDictionary(object obj, IEqualityComparer keyComparer) + { + var dynamicRecord = obj as SimpleRecord; + if (dynamicRecord != null) + { + return new Dictionary(dynamicRecord, keyComparer); + } + + var dictionary = obj as IDictionary; + if (dictionary != null) + { + return dictionary; + } + + var list = obj as IEnumerable; + if (list != null) + { + var originals = list.Cast().ToList(); + var dictionaries = originals.Select(o => ObjectToDictionary(o, keyComparer) as IDictionary).Where(o => o != null && o.Count > 0).ToList(); + if (originals.Count == dictionaries.Count) + return dictionaries; + } + + return obj.ObjectToDictionary(); + } + } } \ No newline at end of file diff --git a/Simple.Data/DataResult.cs b/Simple.Data/DataResult.cs new file mode 100644 index 00000000..593fbca6 --- /dev/null +++ b/Simple.Data/DataResult.cs @@ -0,0 +1,19 @@ +namespace Simple.Data +{ + using System.Collections.Generic; + + public sealed class DataResult : OperationResult + { + private readonly IEnumerable> _data; + + public IEnumerable> Data + { + get { return _data; } + } + + public DataResult(IEnumerable> data) : base(0) + { + _data = data; + } + } +} \ No newline at end of file diff --git a/Simple.Data/DataStrategy.cs b/Simple.Data/DataStrategy.cs index 33c8f165..b612d2c0 100644 --- a/Simple.Data/DataStrategy.cs +++ b/Simple.Data/DataStrategy.cs @@ -1,142 +1,142 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Dynamic; -using System.Linq; -using System.Text; -using Simple.Data.Commands; - -namespace Simple.Data -{ - using System.Reflection; - - /// - /// This class supports the Simple.Data framework internally and should not be used in your code. - /// - public abstract class DataStrategy : DynamicObject, ICloneable - { - private readonly ConcurrentDictionary _members = new ConcurrentDictionary(); - - protected DataStrategy() {} - - protected DataStrategy(DataStrategy copy) - { - _members = copy._members; - } - - public abstract Adapter GetAdapter(); - - /// - /// Provides the implementation for operations that get member values. Classes derived from the class can override this method to specify dynamic behavior for operations such as getting a value for a property. - /// - /// Provides information about the object that called the dynamic operation. The binder.Name property provides the name of the member on which the dynamic operation is performed. For example, for the Console.WriteLine(sampleObject.SampleProperty) statement, where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleProperty". The binder.IgnoreCase property specifies whether the member name is case-sensitive. - /// The result of the get operation. For example, if the method is called for a property, you can assign the property value to . - /// - /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a run-time exception is thrown.) - /// - public override bool TryGetMember(GetMemberBinder binder, out object result) - { - return GetDynamicMember(binder, out result); - } - - protected virtual bool GetDynamicMember(GetMemberBinder binder, out object result) - { - result = GetOrAddDynamicReference(binder.Name); - return true; - } - - private dynamic GetOrAddDynamicReference(string name) - { - return _members.GetOrAdd(name, CreateDynamicReference); - } - - internal bool TryInvokeFunction(String functionName, Func> getFunctionArguments, - out object result) - { - var adapterWithFunctions = GetAdapter() as IAdapterWithFunctions; - if (adapterWithFunctions != null && adapterWithFunctions.IsValidFunction(functionName)) - { - var command = new ExecuteFunctionCommand(GetDatabase(), adapterWithFunctions, functionName, - getFunctionArguments()); - return ExecuteFunction(out result, command); - } - result = null; - return false; - } - - protected internal abstract bool ExecuteFunction(out object result, ExecuteFunctionCommand command); - - public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) - { - if (TryInvokeFunction(binder.Name, () => binder.ArgumentsToDictionary(args), out result)) return true; - - if (new AdapterMethodDynamicInvoker(GetAdapter()).TryInvokeMember(binder, args, out result)) return true; - - return base.TryInvokeMember(binder, args, out result); - } - - public dynamic this[string name] - { - get { return GetOrAddDynamicReference(name); } - } - - private ObjectReference CreateDynamicReference(string name) - { - return new ObjectReference(name, this); - } - - internal DynamicTable SetMemberAsTable(ObjectReference reference) - { - if (reference == null) throw new ArgumentNullException("reference"); - _members.TryUpdate(reference.GetName(), new DynamicTable(reference.GetName(), this), reference); - return (DynamicTable) _members[reference.GetName()]; - } - - internal DynamicTable SetMemberAsTable(ObjectReference reference, DynamicTable table) - { - if (reference == null) throw new ArgumentNullException("reference"); - _members.TryUpdate(reference.GetName(), table, reference); - return (DynamicTable) _members[reference.GetName()]; - } - - internal DynamicSchema SetMemberAsSchema(ObjectReference reference) - { - if (ReferenceEquals(reference, null)) throw new ArgumentNullException("reference"); - _members.TryUpdate(reference.GetName(), new DynamicSchema(reference.GetName(), this), reference); - return (DynamicSchema) _members[reference.GetName()]; - } - - internal DynamicSchema SetMemberAsSchema(ObjectReference reference, DynamicSchema schema) - { - if (reference == null) throw new ArgumentNullException("reference"); - _members.TryUpdate(reference.GetName(), schema, reference); - return (DynamicSchema) _members[reference.GetName()]; - } - - protected internal abstract DataStrategy GetDatabase(); - - internal bool IsExpressionFunction(string name, object[] args) - { - return GetAdapter().IsExpressionFunction(name, args); - } - - internal abstract RunStrategy Run { get; } - - object ICloneable.Clone() - { - return Clone(); - } - - protected internal abstract DataStrategy Clone(); - - public dynamic WithOptions(OptionsBase options) - { - return new DataStrategyWithOptions(this, options); - } - - public virtual dynamic ClearOptions() - { - return this; - } - } -} +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Text; +using Simple.Data.Commands; + +namespace Simple.Data +{ + using System.Reflection; + + /// + /// This class supports the Simple.Data framework internally and should not be used in your code. + /// + public abstract class DataStrategy : DynamicObject, ICloneable + { + private readonly ConcurrentDictionary _members = new ConcurrentDictionary(); + + protected DataStrategy() {} + + protected DataStrategy(DataStrategy copy) + { + _members = copy._members; + } + + public abstract Adapter GetAdapter(); + + /// + /// Provides the implementation for operations that get member values. Classes derived from the class can override this method to specify dynamic behavior for operations such as getting a value for a property. + /// + /// Provides information about the object that called the dynamic operation. The binder.Name property provides the name of the member on which the dynamic operation is performed. For example, for the Console.WriteLine(sampleObject.SampleProperty) statement, where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleProperty". The binder.IgnoreCase property specifies whether the member name is case-sensitive. + /// The result of the get operation. For example, if the method is called for a property, you can assign the property value to . + /// + /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a run-time exception is thrown.) + /// + public override bool TryGetMember(GetMemberBinder binder, out object result) + { + return GetDynamicMember(binder, out result); + } + + protected virtual bool GetDynamicMember(GetMemberBinder binder, out object result) + { + result = GetOrAddDynamicReference(binder.Name); + return true; + } + + private dynamic GetOrAddDynamicReference(string name) + { + return _members.GetOrAdd(name, CreateDynamicReference); + } + + internal bool TryInvokeFunction(String functionName, Func> getFunctionArguments, + out object result) + { + var adapter = GetAdapter(); + if (adapter != null && adapter.IsValidFunction(functionName)) + { + var command = new ExecuteFunctionCommand(GetDatabase(), adapter, functionName, + getFunctionArguments()); + return ExecuteFunction(out result, command); + } + result = null; + return false; + } + + protected internal abstract bool ExecuteFunction(out object result, ExecuteFunctionCommand command); + + public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) + { + if (TryInvokeFunction(binder.Name, () => binder.ArgumentsToDictionary(args), out result)) return true; + + if (new AdapterMethodDynamicInvoker(GetAdapter()).TryInvokeMember(binder, args, out result)) return true; + + return base.TryInvokeMember(binder, args, out result); + } + + public dynamic this[string name] + { + get { return GetOrAddDynamicReference(name); } + } + + private ObjectReference CreateDynamicReference(string name) + { + return new ObjectReference(name, this); + } + + internal DynamicTable SetMemberAsTable(ObjectReference reference) + { + if (reference == null) throw new ArgumentNullException("reference"); + _members.TryUpdate(reference.GetName(), new DynamicTable(reference.GetName(), this), reference); + return (DynamicTable) _members[reference.GetName()]; + } + + internal DynamicTable SetMemberAsTable(ObjectReference reference, DynamicTable table) + { + if (reference == null) throw new ArgumentNullException("reference"); + _members.TryUpdate(reference.GetName(), table, reference); + return (DynamicTable) _members[reference.GetName()]; + } + + internal DynamicSchema SetMemberAsSchema(ObjectReference reference) + { + if (ReferenceEquals(reference, null)) throw new ArgumentNullException("reference"); + _members.TryUpdate(reference.GetName(), new DynamicSchema(reference.GetName(), this), reference); + return (DynamicSchema) _members[reference.GetName()]; + } + + internal DynamicSchema SetMemberAsSchema(ObjectReference reference, DynamicSchema schema) + { + if (reference == null) throw new ArgumentNullException("reference"); + _members.TryUpdate(reference.GetName(), schema, reference); + return (DynamicSchema) _members[reference.GetName()]; + } + + protected internal abstract DataStrategy GetDatabase(); + + internal bool IsExpressionFunction(string name, object[] args) + { + return GetAdapter().IsExpressionFunction(name, args); + } + + internal abstract RunStrategy Run { get; } + + object ICloneable.Clone() + { + return Clone(); + } + + protected internal abstract DataStrategy Clone(); + + public dynamic WithOptions(OptionsBase options) + { + return new DataStrategyWithOptions(this, options); + } + + public virtual dynamic ClearOptions() + { + return this; + } + } +} diff --git a/Simple.Data/DatabaseRunner.cs b/Simple.Data/DatabaseRunner.cs index 4966774f..658b2f6d 100644 --- a/Simple.Data/DatabaseRunner.cs +++ b/Simple.Data/DatabaseRunner.cs @@ -1,102 +1,26 @@ -using Simple.Data.Operations; - -namespace Simple.Data -{ - using System.Collections.Generic; - using System.Linq; - - internal class DatabaseRunner : RunStrategy - { - private readonly Adapter _adapter; - public DatabaseRunner(Adapter adapter) - { - _adapter = adapter; - } - - protected override Adapter Adapter - { - get { return _adapter; } - } - - internal override IReadOnlyDictionary FindOne(FindOperation operation) - { - return _adapter.FindOne(operation); - } - - internal override int UpdateMany(string tableName, IList> dataList) - { - return _adapter.UpdateMany(tableName, dataList); - } - - internal override int UpdateMany(string tableName, IList> dataList, IEnumerable criteriaFieldNames) - { - return _adapter.UpdateMany(tableName, dataList, criteriaFieldNames); - } - - internal override int UpdateMany(string tableName, IList> newValuesList, IList> originalValuesList) - { - int count = 0; - for (int i = 0; i < newValuesList.Count; i++) - { - count += Update(tableName, newValuesList[i], originalValuesList[i]); - } - return count; - } - - internal override int Update(string tableName, IReadOnlyDictionary newValuesDict, IReadOnlyDictionary originalValuesDict) - { - SimpleExpression criteria = CreateCriteriaFromOriginalValues(tableName, newValuesDict, originalValuesDict); - var changedValuesDict = CreateChangedValuesDict(newValuesDict, originalValuesDict); - return _adapter.Update(tableName, changedValuesDict, criteria); - } - - /// - /// Finds data from the specified "table". - /// - /// Operation details. - /// The list of records matching the criteria. If no records are found, return an empty list. - internal override IEnumerable> Find(FindOperation operation) - { - return _adapter.Find(operation); - } - - /// - /// Inserts a record into the specified "table". - /// Name of the table.The values to insert.If possible, return the newly inserted row, including any automatically-set values such as primary keys or timestamps. - internal override IEnumerable> Insert(InsertOperation operation) - { - return _adapter.Insert(operation); - } - - /// - /// Updates the specified "table" according to specified criteria. - /// Name of the table.The new values.The expression to use as criteria for the update operation.The number of records affected by the update operation. - internal override int Update(string tableName, IReadOnlyDictionary data, SimpleExpression criteria) - { - return _adapter.Update(tableName, data, criteria); - } - - public override IEnumerable> Upsert(UpsertOperation operation) - { - return _adapter.Upsert(operation); - } - - public override IReadOnlyDictionary Get(GetOperation operation) - { - return _adapter.Get(operation); - } - - public override IEnumerable> RunQuery(SimpleQuery query, out IEnumerable unhandledClauses) - { - return _adapter.RunQuery(query, out unhandledClauses); - } - - /// - /// Deletes from the specified table. - /// Name of the table.The expression to use as criteria for the delete operation.The number of records which were deleted. - internal override int Delete(string tableName, SimpleExpression criteria) - { - return _adapter.Delete(tableName, criteria); - } - } +using Simple.Data.Operations; + +namespace Simple.Data +{ + using System.Collections.Generic; + using System.Linq; + + internal class DatabaseRunner : RunStrategy + { + private readonly Adapter _adapter; + public DatabaseRunner(Adapter adapter) + { + _adapter = adapter; + } + + protected override Adapter Adapter + { + get { return _adapter; } + } + + internal override OperationResult Execute(IOperation operation) + { + return _adapter.Execute(operation); + } + } } \ No newline at end of file diff --git a/Simple.Data/DynamicSchema.cs b/Simple.Data/DynamicSchema.cs index 4809cb1a..040f3063 100644 --- a/Simple.Data/DynamicSchema.cs +++ b/Simple.Data/DynamicSchema.cs @@ -37,10 +37,10 @@ public override bool TryGetMember(GetMemberBinder binder, out object result) public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) { - var adapterWithFunctions = _dataStrategy.GetAdapter() as IAdapterWithFunctions; - if (adapterWithFunctions != null && adapterWithFunctions.IsValidFunction(string.Format("{0}.{1}", _name, binder.Name))) + var adapter = _dataStrategy.GetAdapter(); + if (adapter != null && adapter.IsValidFunction(string.Format("{0}.{1}", _name, binder.Name))) { - var command = new ExecuteFunctionCommand(_dataStrategy.GetDatabase(), adapterWithFunctions, string.Format("{0}.{1}", _name, binder.Name), + var command = new ExecuteFunctionCommand(_dataStrategy.GetDatabase(), adapter, string.Format("{0}.{1}", _name, binder.Name), binder.ArgumentsToDictionary(args)); return command.Execute(out result); } diff --git a/Simple.Data/DynamicTable.cs b/Simple.Data/DynamicTable.cs index b773fa4f..7a5c4a32 100644 --- a/Simple.Data/DynamicTable.cs +++ b/Simple.Data/DynamicTable.cs @@ -1,195 +1,196 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Text; -using System.Dynamic; -using Simple.Data.Commands; -using Simple.Data.Extensions; -using Simple.Data.Operations; - -namespace Simple.Data -{ - using System.Collections; - - /// - /// Represents a table in a database, or the nearest equivalent in other data stores. - /// - public class DynamicTable : DynamicObject - { - private readonly Dictionary> _delegates; - - private readonly ICollection _delegatesAsCollection; - private readonly string _tableName; - private readonly DynamicSchema _schema; - private readonly DataStrategy _dataStrategy; - - /// - /// Initializes a new instance of the class. - /// - /// Name of the table. - /// The database which owns the table. - internal DynamicTable(string tableName, DataStrategy dataStrategy) - : this(tableName, dataStrategy, null) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// Name of the table. - /// The database which owns the table. - /// The schema to which the table belongs. - internal DynamicTable(string tableName, DataStrategy dataStrategy, DynamicSchema schema) - { - _delegates = new Dictionary>(); - _delegatesAsCollection = _delegates; - _tableName = tableName; - _schema = schema; - _dataStrategy = dataStrategy; - } - - /// - /// Provides the implementation for operations that invoke a member. Classes derived from the class can override this method to specify dynamic behavior for operations such as calling a method. - /// - /// Provides information about the dynamic operation. The binder.Name property provides the name of the member on which the dynamic operation is performed. For example, for the statement sampleObject.SampleMethod(100), where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleMethod". The binder.IgnoreCase property specifies whether the member name is case-sensitive. - /// The arguments that are passed to the object member during the invoke operation. For example, for the statement sampleObject.SampleMethod(100), where sampleObject is derived from the class, is equal to 100. - /// The result of the member invocation. - /// - /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a language-specific run-time exception is thrown.) - /// - public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) - { - var signature = FunctionSignature.FromBinder(binder, args); - Func func; - if (_delegatesAsCollection.IsSynchronized && _delegates.ContainsKey(signature)) - { - func = _delegates[signature]; - } - else - { - lock (_delegatesAsCollection.SyncRoot) - { - if (!_delegates.ContainsKey(signature)) - { - func = CreateMemberDelegate(signature, binder, args); - _delegates.Add(signature, func); - } - else - { - func = _delegates[signature]; - } - } - } - if (func != null) - { - result = func(args); - return true; - } - - var command = CommandFactory.GetCommandFor(binder.Name); - if (command != null) - { - result = command.Execute(_dataStrategy, this, binder, args); - return true; - } - - var query = new SimpleQuery(_dataStrategy, _tableName); - if (query.TryInvokeMember(binder, args, out result)) - { - return true; - } - - if (base.TryInvokeMember(binder, args, out result)) return true; - - throw new InvalidOperationException(string.Format("Method {0} not recognised", binder.Name)); - } - - private Func CreateMemberDelegate(string signature, InvokeMemberBinder binder, object[] args) - { - try - { - var delegateCreatingCommand = CommandFactory.GetCommandFor(binder.Name) as ICreateDelegate; - if (delegateCreatingCommand == null) return null; - return delegateCreatingCommand.CreateDelegate(_dataStrategy, this, binder, args); - } - catch (NotImplementedException) - { - return null; - } - } - - /// - /// Provides the implementation for operations that get member values. Classes derived from the class can override this method to specify dynamic behavior for operations such as getting a value for a property. - /// - /// Provides information about the object that called the dynamic operation. The binder.Name property provides the name of the member on which the dynamic operation is performed. For example, for the Console.WriteLine(sampleObject.SampleProperty) statement, where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleProperty". The binder.IgnoreCase property specifies whether the member name is case-sensitive. - /// The result of the get operation. For example, if the method is called for a property, you can assign the property value to . - /// - /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a run-time exception is thrown.) - /// - public override bool TryGetMember(GetMemberBinder binder, out object result) - { - if (binder.Name == "All") - { - SimpleDataTraceSources.TraceSource.TraceEvent(TraceEventType.Warning, SimpleDataTraceSources.ObsoleteWarningMessageId, - "The dynamic 'All' property is deprecated; use the 'All()' method instead."); - result = GetAll().ToList(); - return true; - } - result = new ObjectReference(binder.Name, new ObjectReference(_tableName, (_schema != null ? new ObjectReference(_schema.GetName()) : null), _dataStrategy)); - return true; - } - - public override bool TrySetMember(SetMemberBinder binder, object value) - { - if (base.TrySetMember(binder, value)) - { - return true; - } - throw new BadExpressionException("Cannot assign values to table columns."); - } - - public ObjectReference As(string alias) - { - return new ObjectReference(_tableName, (_schema != null ? new ObjectReference(_schema.GetName()) : null), _dataStrategy, alias); - } - - public ObjectReference this[string name] - { - get { return new ObjectReference(name, new ObjectReference(_tableName, (_schema != null ? new ObjectReference(_schema.GetName()) : null), _dataStrategy)); } - } - - internal string GetName() - { - return _tableName; - } - - internal string GetQualifiedName() - { - return _schema != null ? _schema.GetName() + "." + _tableName : _tableName; - } - - private IEnumerable GetAll() - { - return _dataStrategy.Run.Find(new FindOperation(_tableName, null)).Select(dict => new SimpleRecord(dict, _tableName, _dataStrategy)); - } - - public AllColumnsSpecialReference AllColumns() - { - return new AllColumnsSpecialReference(this.ToObjectReference()); - } - - public AllColumnsSpecialReference Star() - { - return AllColumns(); - } - - internal ObjectReference ToObjectReference() - { - if (_schema == null) return new ObjectReference(_tableName, _dataStrategy); - var schemaReference = new ObjectReference(_schema.GetName(), _dataStrategy); - return new ObjectReference(_tableName, schemaReference, _dataStrategy); - } - } -} +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Dynamic; +using Simple.Data.Commands; +using Simple.Data.Extensions; +using Simple.Data.Operations; + +namespace Simple.Data +{ + using System.Collections; + + /// + /// Represents a table in a database, or the nearest equivalent in other data stores. + /// + public class DynamicTable : DynamicObject + { + private readonly Dictionary> _delegates; + + private readonly ICollection _delegatesAsCollection; + private readonly string _tableName; + private readonly DynamicSchema _schema; + private readonly DataStrategy _dataStrategy; + + /// + /// Initializes a new instance of the class. + /// + /// Name of the table. + /// The database which owns the table. + internal DynamicTable(string tableName, DataStrategy dataStrategy) + : this(tableName, dataStrategy, null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// Name of the table. + /// The database which owns the table. + /// The schema to which the table belongs. + internal DynamicTable(string tableName, DataStrategy dataStrategy, DynamicSchema schema) + { + _delegates = new Dictionary>(); + _delegatesAsCollection = _delegates; + _tableName = tableName; + _schema = schema; + _dataStrategy = dataStrategy; + } + + /// + /// Provides the implementation for operations that invoke a member. Classes derived from the class can override this method to specify dynamic behavior for operations such as calling a method. + /// + /// Provides information about the dynamic operation. The binder.Name property provides the name of the member on which the dynamic operation is performed. For example, for the statement sampleObject.SampleMethod(100), where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleMethod". The binder.IgnoreCase property specifies whether the member name is case-sensitive. + /// The arguments that are passed to the object member during the invoke operation. For example, for the statement sampleObject.SampleMethod(100), where sampleObject is derived from the class, is equal to 100. + /// The result of the member invocation. + /// + /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a language-specific run-time exception is thrown.) + /// + public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) + { + var signature = FunctionSignature.FromBinder(binder, args); + Func func; + if (_delegatesAsCollection.IsSynchronized && _delegates.ContainsKey(signature)) + { + func = _delegates[signature]; + } + else + { + lock (_delegatesAsCollection.SyncRoot) + { + if (!_delegates.ContainsKey(signature)) + { + func = CreateMemberDelegate(signature, binder, args); + _delegates.Add(signature, func); + } + else + { + func = _delegates[signature]; + } + } + } + if (func != null) + { + result = func(args); + return true; + } + + var command = CommandFactory.GetCommandFor(binder.Name); + if (command != null) + { + result = command.Execute(_dataStrategy, this, binder, args); + return true; + } + + var query = new SimpleQuery(_dataStrategy, _tableName); + if (query.TryInvokeMember(binder, args, out result)) + { + return true; + } + + if (base.TryInvokeMember(binder, args, out result)) return true; + + throw new InvalidOperationException(string.Format("Method {0} not recognised", binder.Name)); + } + + private Func CreateMemberDelegate(string signature, InvokeMemberBinder binder, object[] args) + { + try + { + var delegateCreatingCommand = CommandFactory.GetCommandFor(binder.Name) as ICreateDelegate; + if (delegateCreatingCommand == null) return null; + return delegateCreatingCommand.CreateDelegate(_dataStrategy, this, binder, args); + } + catch (NotImplementedException) + { + return null; + } + } + + /// + /// Provides the implementation for operations that get member values. Classes derived from the class can override this method to specify dynamic behavior for operations such as getting a value for a property. + /// + /// Provides information about the object that called the dynamic operation. The binder.Name property provides the name of the member on which the dynamic operation is performed. For example, for the Console.WriteLine(sampleObject.SampleProperty) statement, where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleProperty". The binder.IgnoreCase property specifies whether the member name is case-sensitive. + /// The result of the get operation. For example, if the method is called for a property, you can assign the property value to . + /// + /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a run-time exception is thrown.) + /// + public override bool TryGetMember(GetMemberBinder binder, out object result) + { + if (binder.Name == "All") + { + SimpleDataTraceSources.TraceSource.TraceEvent(TraceEventType.Warning, SimpleDataTraceSources.ObsoleteWarningMessageId, + "The dynamic 'All' property is deprecated; use the 'All()' method instead."); + result = GetAll().ToList(); + return true; + } + result = new ObjectReference(binder.Name, new ObjectReference(_tableName, (_schema != null ? new ObjectReference(_schema.GetName()) : null), _dataStrategy)); + return true; + } + + public override bool TrySetMember(SetMemberBinder binder, object value) + { + if (base.TrySetMember(binder, value)) + { + return true; + } + throw new BadExpressionException("Cannot assign values to table columns."); + } + + public ObjectReference As(string alias) + { + return new ObjectReference(_tableName, (_schema != null ? new ObjectReference(_schema.GetName()) : null), _dataStrategy, alias); + } + + public ObjectReference this[string name] + { + get { return new ObjectReference(name, new ObjectReference(_tableName, (_schema != null ? new ObjectReference(_schema.GetName()) : null), _dataStrategy)); } + } + + internal string GetName() + { + return _tableName; + } + + internal string GetQualifiedName() + { + return _schema != null ? _schema.GetName() + "." + _tableName : _tableName; + } + + private IEnumerable GetAll() + { + var result = (DataResult) _dataStrategy.Run.Execute(new QueryOperation(null)); + return result.Data.Select(dict => new SimpleRecord(dict, _tableName, _dataStrategy)); + } + + public AllColumnsSpecialReference AllColumns() + { + return new AllColumnsSpecialReference(this.ToObjectReference()); + } + + public AllColumnsSpecialReference Star() + { + return AllColumns(); + } + + internal ObjectReference ToObjectReference() + { + if (_schema == null) return new ObjectReference(_tableName, _dataStrategy); + var schemaReference = new ObjectReference(_schema.GetName(), _dataStrategy); + return new ObjectReference(_tableName, schemaReference, _dataStrategy); + } + } +} diff --git a/Simple.Data/Extensions/IDictionaryExtensions.cs b/Simple.Data/Extensions/IDictionaryExtensions.cs index e5a45c3b..9bfad06d 100644 --- a/Simple.Data/Extensions/IDictionaryExtensions.cs +++ b/Simple.Data/Extensions/IDictionaryExtensions.cs @@ -5,11 +5,18 @@ namespace Simple.Data.Extensions { + using System.Collections.ObjectModel; + internal static class DictionaryExtensions { public static SimpleRecord ToDynamicRecord(this IDictionary dictionary, string tableName, DataStrategy dataStrategy) { return dictionary == null ? null : new SimpleRecord(dictionary, tableName, dataStrategy); } + + public static IReadOnlyDictionary ToReadOnly(this IDictionary dictionary) + { + return new ReadOnlyDictionary(dictionary); + } } } diff --git a/Simple.Data/IAdapterWithFunctions.cs b/Simple.Data/IAdapterWithFunctions.cs deleted file mode 100644 index 1b2bd93b..00000000 --- a/Simple.Data/IAdapterWithFunctions.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using ResultSet = System.Collections.Generic.IEnumerable>>; - -namespace Simple.Data -{ - /// - /// Represents an Adapter which supports functions; for example, the Ado adapter supports this with Stored Procedures. - /// - /// It may be possible to add functions to access data-store specific functionality (CreateIndex?) with this interface. - public interface IAdapterWithFunctions - { - bool IsValidFunction(string functionName); - IEnumerable Execute(string functionName, IReadOnlyDictionary parameters); - IEnumerable Execute(string functionName, IReadOnlyDictionary parameters, IAdapterTransaction transaction); - } -} diff --git a/Simple.Data/IAdapterWithTransactions.cs b/Simple.Data/IAdapterWithTransactions.cs index 506bb57d..cb9893e6 100644 --- a/Simple.Data/IAdapterWithTransactions.cs +++ b/Simple.Data/IAdapterWithTransactions.cs @@ -1,64 +1,17 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using System.Text; -using Simple.Data.Operations; - -namespace Simple.Data -{ - public interface IAdapterWithTransactions - { - IAdapterTransaction BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.Unspecified); - IAdapterTransaction BeginTransaction(string name, IsolationLevel isolationLevel = IsolationLevel.Unspecified); - - /// - /// Finds data from the specified "table". - /// - /// Operation details. - /// The transaction with which the operation is associated. - /// The list of records matching the criteria. If no records are found, return an empty list. - IEnumerable> Find(FindOperation operation, IAdapterTransaction transaction); - - /// - /// Inserts a record into the specified "table". - /// - /// - /// The transaction with which the operation is associated. - /// If possible and required, return the newly inserted row(s), including any automatically-set values such as primary keys or timestamps. - IEnumerable> Insert(InsertOperation operation, IAdapterTransaction transaction); - - /// - /// Updates the specified "table" according to specified criteria. - /// - /// Name of the table.The new values.The expression to use as criteria for the update operation. - /// The transaction with which the operation is associated. - /// The number of records affected by the update operation. - int Update(string tableName, IReadOnlyDictionary data, SimpleExpression criteria, IAdapterTransaction transaction); - - /// - /// Deletes from the specified table. - /// - /// Name of the table.The expression to use as criteria for the delete operation. - /// The transaction with which the operation is associated. - /// The number of records which were deleted. - int Delete(string tableName, SimpleExpression criteria, IAdapterTransaction transaction); - - /// - /// Updates the specified "table" according to primary key information where available. - /// - /// Name of the table.The new values. - /// The transaction with which the operation is associated. - /// The number of records affected by the update operation. - int UpdateMany(string tableName, IEnumerable> dataList, IAdapterTransaction adapterTransaction); - - int UpdateMany(string tableName, IEnumerable> dataList, IAdapterTransaction adapterTransaction, IList keyFields); - - int UpdateMany(string tableName, IList> dataList, IEnumerable criteriaFieldNames, IAdapterTransaction adapterTransaction); - - IEnumerable> Upsert(UpsertOperation operation, - IAdapterTransaction transaction); - IReadOnlyDictionary Get(GetOperation operation, IAdapterTransaction transaction); - IEnumerable> RunQuery(SimpleQuery query, IAdapterTransaction transaction, out IEnumerable unhandledClauses); - } -} +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using Simple.Data.Operations; + +namespace Simple.Data +{ + public interface IAdapterWithTransactions + { + IAdapterTransaction BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.Unspecified); + IAdapterTransaction BeginTransaction(string name, IsolationLevel isolationLevel = IsolationLevel.Unspecified); + + OperationResult Execute(IOperation operation, IAdapterTransaction transaction); + } +} diff --git a/Simple.Data/InMemoryAdapter.cs b/Simple.Data/InMemoryAdapter.cs index d6c49a5d..7e2aac65 100644 --- a/Simple.Data/InMemoryAdapter.cs +++ b/Simple.Data/InMemoryAdapter.cs @@ -1,418 +1,452 @@ -using Simple.Data.Operations; - -namespace Simple.Data -{ - using System; - using System.Collections.Generic; - using System.Collections.ObjectModel; - using System.Linq; - using QueryPolyfills; - - public partial class InMemoryAdapter : Adapter, IAdapterWithFunctions - { - private readonly Dictionary _autoIncrementColumns; - private readonly Dictionary _keyColumns; - - private readonly Dictionary>> _tables; - - [Flags] - private enum FunctionFlags - { - None = 0x00000000, - PassThru = 0x00000001 - } - - private class FunctionInfo - { - public FunctionInfo(Delegate func, FunctionFlags flags) - { - Delegate = func; - Flags = flags; - } - - public Delegate Delegate { get; private set; } - public FunctionFlags Flags { get; private set; } - } - - private readonly Dictionary _functions = new Dictionary(); - - private readonly ICollection _joins = new Collection(); - - public InMemoryAdapter() : this(StringComparer.OrdinalIgnoreCase) - { - } - - public InMemoryAdapter(IEqualityComparer nameComparer) - { - _nameComparer = nameComparer; - _keyColumns = new Dictionary(_nameComparer); - _autoIncrementColumns = new Dictionary(_nameComparer); - _tables = new Dictionary>>(nameComparer); - } - - private List> GetTable(string tableName) - { - tableName = tableName.ToLowerInvariant(); - if (!_tables.ContainsKey(tableName)) _tables.Add(tableName, new List>()); - return _tables[tableName]; - } - - public override IReadOnlyDictionary GetKey(string tableName, IReadOnlyDictionary record) - { - if (!_keyColumns.ContainsKey(tableName)) return null; - return _keyColumns[tableName].ToDictionary(key => key, key => record.ContainsKey(key) ? record[key] : null); - } - - public override IList GetKeyNames(string tableName) - { - if (!_keyColumns.ContainsKey(tableName)) return null; - return _keyColumns[tableName]; - } - - public override IReadOnlyDictionary Get(GetOperation operation) - { - if (!_keyColumns.ContainsKey(operation.TableName)) throw new InvalidOperationException("No key specified for In-Memory table."); - var keys = _keyColumns[operation.TableName]; - if (keys.Length != operation.KeyValues.Length) throw new ArgumentException("Incorrect number of values for key."); - var expression = new ObjectReference(keys[0]) == operation.KeyValues[0]; - for (int i = 1; i < operation.KeyValues.Length; i++) - { - expression = expression && new ObjectReference(keys[i]) == operation.KeyValues[i]; - } - - return new ReadOnlyDictionary(Find(operation.TableName, expression).FirstOrDefault()); - } - - public override IEnumerable> Find(FindOperation operation) - { - return Find(operation.TableName, operation.Criteria).Select(d => new ReadOnlyDictionary(d)); - } - - private IEnumerable> Find(string tableName, SimpleExpression criteria) - { - var whereClauseHandler = new WhereClauseHandler(tableName, new WhereClause(criteria)); - return whereClauseHandler.Run(GetTable(tableName)); - } - - public override IEnumerable> RunQuery(SimpleQuery query, - out IEnumerable - unhandledClauses) - { - unhandledClauses = query.Clauses.AsEnumerable(); - return GetTable(query.TableName); - } - - public override IEnumerable> Insert(InsertOperation operation) - { - foreach (var data in operation.Data.Select(d => d.ToDictionary(kvp => kvp.Key, kvp => kvp.Value))) - { - if (_autoIncrementColumns.ContainsKey(operation.TableName)) - { - var table = GetTable(operation.TableName); - var autoIncrementColumn = _autoIncrementColumns[operation.TableName]; - - if (!data.ContainsKey(autoIncrementColumn)) - { - data.Add(autoIncrementColumn, 0); - } - - object nextVal = 0; - if (table.Count > 0) - { - nextVal = table.Select(d => d[autoIncrementColumn]).Max(); - } - - nextVal = ObjectMaths.Increment(nextVal); - data[autoIncrementColumn] = nextVal; - } - - GetTable(operation.TableName).Add(data); - - AddAsDetail(operation.TableName, data); - AddAsMaster(operation.TableName, data); - - yield return data; - } - } - - private void AddAsDetail(string tableName, IDictionary data) - { - foreach (var @join in _joins.Where(j => j.DetailTableName.Equals(tableName, StringComparison.OrdinalIgnoreCase))) - { - if (!data.ContainsKey(@join.DetailKey)) continue; - foreach ( - var master in - GetTable(@join.MasterTableName).Where( - d => d.ContainsKey(@join.MasterKey) && d[@join.MasterKey].Equals(data[@join.DetailKey]))) - { - data[@join.MasterPropertyName] = master; - if (!master.ContainsKey(@join.DetailPropertyName)) - { - master.Add(@join.DetailPropertyName, new List> {data}); - } - else - { - ((List>) master[@join.DetailPropertyName]).Add(data); - } - } - } - } - - private void AddAsMaster(string tableName, IDictionary data) - { - foreach (var @join in _joins.Where(j => j.MasterTableName.Equals(tableName, StringComparison.OrdinalIgnoreCase))) - { - if (!data.ContainsKey(@join.MasterKey)) continue; - foreach ( - var detail in - GetTable(@join.DetailTableName).Where( - d => d.ContainsKey(@join.DetailKey) && d[@join.DetailKey].Equals(data[@join.MasterKey]))) - { - detail[@join.MasterPropertyName] = data; - if (!data.ContainsKey(@join.DetailPropertyName)) - { - data.Add(@join.DetailPropertyName, new List> {data}); - } - else - { - ((List>) data[@join.DetailPropertyName]).Add(data); - } - } - } - } - - public override int Update(string tableName, IReadOnlyDictionary data, SimpleExpression criteria) - { - int count = 0; - foreach (var record in Find(tableName, criteria)) - { - UpdateRecord(data, record); - ++count; - } - return count; - } - - private static void UpdateRecord(IEnumerable> data, IDictionary record) - { - foreach (var kvp in data) - { - record[kvp.Key] = kvp.Value; - } - } - - public override int Delete(string tableName, SimpleExpression criteria) - { - List> deletions = Find(tableName, criteria).ToList(); - foreach (var record in deletions) - { - GetTable(tableName).Remove(record); - } - return deletions.Count; - } - - public override bool IsExpressionFunction(string functionName, params object[] args) - { - return (functionName.Equals("like", StringComparison.OrdinalIgnoreCase) || - functionName.Equals("notlike", StringComparison.OrdinalIgnoreCase)) - && args.Length == 1 - && args[0] is string; - } - - public void SetAutoIncrementColumn(string tableName, string columnName) - { - _autoIncrementColumns.Add(tableName, columnName); - } - - public void SetKeyColumn(string tableName, string columnName) - { - _keyColumns[tableName] = new[] {columnName}; - } - - public void SetAutoIncrementKeyColumn(string tableName, string columnName) - { - SetKeyColumn(tableName, columnName); - SetAutoIncrementColumn(tableName, columnName); - } - - public void SetKeyColumns(string tableName, params string[] columnNames) - { - _keyColumns[tableName] = columnNames; - } - - /// - /// Set up an implicit join between two tables. - /// - /// The name of the 'master' table - /// The 'primary key' - /// The name to give the lookup property in the detail objects - /// The name of the 'master' table - /// The 'foreign key' - /// The name to give the collection property in the master object - public void ConfigureJoin(string masterTableName, string masterKey, string masterPropertyName, string detailTableName, string detailKey, string detailPropertyName) - { - var join = new JoinInfo(masterTableName, masterKey, masterPropertyName, detailTableName, detailKey, - detailPropertyName); - _joins.Add(join); - } - - public JoinConfig Join - { - get { return new JoinConfig(_joins);} - } - - private IEqualityComparer _nameComparer = EqualityComparer.Default; - - internal class JoinInfo - { - private readonly string _masterTableName; - private readonly string _masterKey; - private readonly string _masterPropertyName; - private readonly string _detailTableName; - private readonly string _detailKey; - private readonly string _detailPropertyName; - - public JoinInfo(string masterTableName, string masterKey, string masterPropertyName, string detailTableName, string detailKey, string detailPropertyName) - { - _masterTableName = masterTableName; - _masterKey = masterKey; - _masterPropertyName = masterPropertyName; - _detailTableName = detailTableName; - _detailKey = detailKey; - _detailPropertyName = detailPropertyName; - } - - public string DetailPropertyName - { - get { return _detailPropertyName; } - } - - public string DetailKey - { - get { return _detailKey; } - } - - public string DetailTableName - { - get { return _detailTableName; } - } - - public string MasterPropertyName - { - get { return _masterPropertyName; } - } - - public string MasterKey - { - get { return _masterKey; } - } - - public string MasterTableName - { - get { return _masterTableName; } - } - } - - public override IEnumerable> Upsert(UpsertOperation operation) - { - throw new NotImplementedException(); - } - - public IReadOnlyDictionary Get(GetOperation operation, IAdapterTransaction transaction) - { - return Get(operation); - } - - public class JoinConfig - { - private readonly ICollection _joins; - private JoinInfo _joinInfo; - - internal JoinConfig(ICollection joins) - { - _joins = joins; - _joinInfo = new JoinInfo(null,null,null,null,null,null); - } - - public JoinConfig Master(string tableName, string keyName, string propertyNameInDetailRecords = null) - { - if (_joins.Contains(_joinInfo)) _joins.Remove(_joinInfo); - _joinInfo = new JoinInfo(tableName, keyName, propertyNameInDetailRecords ?? tableName, _joinInfo.DetailTableName, - _joinInfo.DetailKey, _joinInfo.DetailPropertyName); - _joins.Add(_joinInfo); - return this; - } - - - public JoinConfig Detail(string tableName, string keyName, string propertyNameInMasterRecords = null) - { - if (_joins.Contains(_joinInfo)) _joins.Remove(_joinInfo); - _joinInfo = new JoinInfo(_joinInfo.MasterTableName, _joinInfo.MasterKey, _joinInfo.MasterPropertyName, - tableName, keyName, - propertyNameInMasterRecords ?? tableName); - _joins.Add(_joinInfo); - return this; - } - } - - public void AddFunction(string functionName, Func function) - { - _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); - } - - public void AddFunction(string functionName, Func function) - { - _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); - } - - public void AddFunction(string functionName, Func function) - { - _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); - } - - public void AddFunction(string functionName, Func function) - { - _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); - } - - public void AddFunction(string functionName, Func function) - { - _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); - } - - public void AddDelegate(string functionName, Delegate function) - { - _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); - } - - public void AddFunction(string functionName, Func, TResult> function) - { - _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.PassThru)); - } - - public bool IsValidFunction(string functionName) - { - return _functions.ContainsKey(functionName); - } - - public IEnumerable>>> Execute(string functionName, IReadOnlyDictionary parameters) - { - if (!_functions.ContainsKey(functionName)) throw new InvalidOperationException(string.Format("Function '{0}' not found.", functionName)); - var obj = ((_functions[functionName].Flags & FunctionFlags.PassThru) == FunctionFlags.PassThru) ? - _functions[functionName].Delegate.DynamicInvoke(parameters) : - _functions[functionName].Delegate.DynamicInvoke(parameters.Values.ToArray()); - - var dict = obj as IDictionary; - if (dict != null) return new List>> { new List> { dict } }; - - var list = obj as IEnumerable>; - if (list != null) return new List>> { list }; - - return obj as IEnumerable>>; - } - - public IEnumerable>>> Execute(string functionName, IReadOnlyDictionary parameters, IAdapterTransaction transaction) - { - return Execute(functionName, parameters); - } - } +using Simple.Data.Operations; + +namespace Simple.Data +{ + using System; + using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.Data; + using System.Linq; + using System.Runtime.Remoting.Messaging; + using Extensions; + using QueryPolyfills; + + public partial class InMemoryAdapter : Adapter + { + private static readonly Dictionary> OperationFunctions + = new Dictionary> + { + {typeof(GetOperation), (a,o) => a.Get((GetOperation)o)} + }; + private readonly Dictionary _autoIncrementColumns; + private readonly Dictionary _keyColumns; + private readonly Dictionary>> _tables; + + [Flags] + private enum FunctionFlags + { + None = 0x00000000, + PassThru = 0x00000001 + } + + private class FunctionInfo + { + public FunctionInfo(Delegate func, FunctionFlags flags) + { + Delegate = func; + Flags = flags; + } + + public Delegate Delegate { get; private set; } + public FunctionFlags Flags { get; private set; } + } + + private readonly Dictionary _functions = new Dictionary(); + + private readonly ICollection _joins = new Collection(); + + public InMemoryAdapter() : this(StringComparer.OrdinalIgnoreCase) + { + } + + public InMemoryAdapter(IEqualityComparer keyComparer) + { + _keyComparer = keyComparer; + _keyColumns = new Dictionary(_keyComparer); + _autoIncrementColumns = new Dictionary(_keyComparer); + _tables = new Dictionary>>(keyComparer); + } + + public override IEqualityComparer KeyComparer + { + get { return _keyComparer; } + } + + private List> GetTable(string tableName) + { + tableName = tableName.ToLowerInvariant(); + if (!_tables.ContainsKey(tableName)) _tables.Add(tableName, new List>()); + return _tables[tableName]; + } + + public override IReadOnlyDictionary GetKey(string tableName, IReadOnlyDictionary record) + { + if (!_keyColumns.ContainsKey(tableName)) return null; + return _keyColumns[tableName].ToDictionary(key => key, key => record.ContainsKey(key) ? record[key] : null); + } + + public override IList GetKeyNames(string tableName) + { + if (!_keyColumns.ContainsKey(tableName)) return null; + return _keyColumns[tableName]; + } + + IAdapterTransaction IAdapterWithTransactions.BeginTransaction(IsolationLevel isolationLevel) + { + return BeginTransaction(isolationLevel); + } + + private IEnumerable> Find(string tableName, SimpleExpression criteria) + { + var whereClauseHandler = new WhereClauseHandler(tableName, new WhereClause(criteria)); + return whereClauseHandler.Run(GetTable(tableName)); + } + + public override OperationResult Execute(IOperation operation) + { + if (operation == null) throw new ArgumentNullException("operation"); + + Func func; + if (OperationFunctions.TryGetValue(operation.GetType(), out func)) + { + return func(this, operation); + } + throw new NotSupportedException(); + } + + public OperationResult Execute(IOperation operation, IAdapterTransaction transaction) + { + return Execute(operation); + } + + private DataResult Get(GetOperation operation) + { + if (!_keyColumns.ContainsKey(operation.TableName)) throw new InvalidOperationException("No key specified for In-Memory table."); + var keys = _keyColumns[operation.TableName]; + if (keys.Length != operation.KeyValues.Length) throw new ArgumentException("Incorrect number of values for key."); + var expression = new ObjectReference(keys[0]) == operation.KeyValues[0]; + for (int i = 1; i < operation.KeyValues.Length; i++) + { + expression = expression && new ObjectReference(keys[i]) == operation.KeyValues[i]; + } + + return new DataResult(Find(operation.TableName, expression)); + } + + private DataResult RunQuery(SimpleQuery query, out IEnumerable unhandledClauses) + { + unhandledClauses = query.Clauses.AsEnumerable(); + return new DataResult(GetTable(query.TableName)); + } + + private DataResult Insert(InsertOperation operation) + { + return new DataResult(InsertImpl(operation)); + } + + private IEnumerable> InsertImpl(InsertOperation operation) + { + foreach (var data in operation.Data.Select(d => d.ToDictionary(kvp => kvp.Key, kvp => kvp.Value))) + { + if (_autoIncrementColumns.ContainsKey(operation.TableName)) + { + var table = GetTable(operation.TableName); + var autoIncrementColumn = _autoIncrementColumns[operation.TableName]; + + if (!data.ContainsKey(autoIncrementColumn)) + { + data.Add(autoIncrementColumn, 0); + } + + object nextVal = 0; + if (table.Count > 0) + { + nextVal = table.Select(d => d[autoIncrementColumn]).Max(); + } + + nextVal = ObjectMaths.Increment(nextVal); + data[autoIncrementColumn] = nextVal; + } + + GetTable(operation.TableName).Add(data); + + AddAsDetail(operation.TableName, data); + AddAsMaster(operation.TableName, data); + + yield return data; + } + } + + private void AddAsDetail(string tableName, IDictionary data) + { + foreach (var @join in _joins.Where(j => j.DetailTableName.Equals(tableName, StringComparison.OrdinalIgnoreCase))) + { + if (!data.ContainsKey(@join.DetailKey)) continue; + foreach ( + var master in + GetTable(@join.MasterTableName).Where( + d => d.ContainsKey(@join.MasterKey) && d[@join.MasterKey].Equals(data[@join.DetailKey]))) + { + data[@join.MasterPropertyName] = master; + if (!master.ContainsKey(@join.DetailPropertyName)) + { + master.Add(@join.DetailPropertyName, new List> {data}); + } + else + { + ((List>) master[@join.DetailPropertyName]).Add(data); + } + } + } + } + + private void AddAsMaster(string tableName, IDictionary data) + { + foreach (var @join in _joins.Where(j => j.MasterTableName.Equals(tableName, StringComparison.OrdinalIgnoreCase))) + { + if (!data.ContainsKey(@join.MasterKey)) continue; + foreach ( + var detail in + GetTable(@join.DetailTableName).Where( + d => d.ContainsKey(@join.DetailKey) && d[@join.DetailKey].Equals(data[@join.MasterKey]))) + { + detail[@join.MasterPropertyName] = data; + if (!data.ContainsKey(@join.DetailPropertyName)) + { + data.Add(@join.DetailPropertyName, new List> {data}); + } + else + { + ((List>) data[@join.DetailPropertyName]).Add(data); + } + } + } + } + + private CommandResult Update(string tableName, IReadOnlyDictionary data, SimpleExpression criteria) + { + int count = 0; + foreach (var record in Find(tableName, criteria)) + { + UpdateRecord(data, record); + ++count; + } + return new CommandResult(count); + } + + private static void UpdateRecord(IEnumerable> data, IDictionary record) + { + foreach (var kvp in data) + { + record[kvp.Key] = kvp.Value; + } + } + + private CommandResult Delete(string tableName, SimpleExpression criteria) + { + List> deletions = Find(tableName, criteria).ToList(); + foreach (var record in deletions) + { + GetTable(tableName).Remove(record); + } + return new CommandResult(deletions.Count); + } + + public override bool IsExpressionFunction(string functionName, params object[] args) + { + return (functionName.Equals("like", StringComparison.OrdinalIgnoreCase) || + functionName.Equals("notlike", StringComparison.OrdinalIgnoreCase)) + && args.Length == 1 + && args[0] is string; + } + + public void SetAutoIncrementColumn(string tableName, string columnName) + { + _autoIncrementColumns.Add(tableName, columnName); + } + + public void SetKeyColumn(string tableName, string columnName) + { + _keyColumns[tableName] = new[] {columnName}; + } + + public void SetAutoIncrementKeyColumn(string tableName, string columnName) + { + SetKeyColumn(tableName, columnName); + SetAutoIncrementColumn(tableName, columnName); + } + + public void SetKeyColumns(string tableName, params string[] columnNames) + { + _keyColumns[tableName] = columnNames; + } + + /// + /// Set up an implicit join between two tables. + /// + /// The name of the 'master' table + /// The 'primary key' + /// The name to give the lookup property in the detail objects + /// The name of the 'master' table + /// The 'foreign key' + /// The name to give the collection property in the master object + public void ConfigureJoin(string masterTableName, string masterKey, string masterPropertyName, string detailTableName, string detailKey, string detailPropertyName) + { + var join = new JoinInfo(masterTableName, masterKey, masterPropertyName, detailTableName, detailKey, + detailPropertyName); + _joins.Add(join); + } + + public JoinConfig Join + { + get { return new JoinConfig(_joins);} + } + + private readonly IEqualityComparer _keyComparer = EqualityComparer.Default; + + internal class JoinInfo + { + private readonly string _masterTableName; + private readonly string _masterKey; + private readonly string _masterPropertyName; + private readonly string _detailTableName; + private readonly string _detailKey; + private readonly string _detailPropertyName; + + public JoinInfo(string masterTableName, string masterKey, string masterPropertyName, string detailTableName, string detailKey, string detailPropertyName) + { + _masterTableName = masterTableName; + _masterKey = masterKey; + _masterPropertyName = masterPropertyName; + _detailTableName = detailTableName; + _detailKey = detailKey; + _detailPropertyName = detailPropertyName; + } + + public string DetailPropertyName + { + get { return _detailPropertyName; } + } + + public string DetailKey + { + get { return _detailKey; } + } + + public string DetailTableName + { + get { return _detailTableName; } + } + + public string MasterPropertyName + { + get { return _masterPropertyName; } + } + + public string MasterKey + { + get { return _masterKey; } + } + + public string MasterTableName + { + get { return _masterTableName; } + } + } + + public DataResult Get(GetOperation operation, IAdapterTransaction transaction) + { + return Get(operation); + } + + public class JoinConfig + { + private readonly ICollection _joins; + private JoinInfo _joinInfo; + + internal JoinConfig(ICollection joins) + { + _joins = joins; + _joinInfo = new JoinInfo(null,null,null,null,null,null); + } + + public JoinConfig Master(string tableName, string keyName, string propertyNameInDetailRecords = null) + { + if (_joins.Contains(_joinInfo)) _joins.Remove(_joinInfo); + _joinInfo = new JoinInfo(tableName, keyName, propertyNameInDetailRecords ?? tableName, _joinInfo.DetailTableName, + _joinInfo.DetailKey, _joinInfo.DetailPropertyName); + _joins.Add(_joinInfo); + return this; + } + + + public JoinConfig Detail(string tableName, string keyName, string propertyNameInMasterRecords = null) + { + if (_joins.Contains(_joinInfo)) _joins.Remove(_joinInfo); + _joinInfo = new JoinInfo(_joinInfo.MasterTableName, _joinInfo.MasterKey, _joinInfo.MasterPropertyName, + tableName, keyName, + propertyNameInMasterRecords ?? tableName); + _joins.Add(_joinInfo); + return this; + } + } + + public void AddFunction(string functionName, Func function) + { + _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); + } + + public void AddFunction(string functionName, Func function) + { + _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); + } + + public void AddFunction(string functionName, Func function) + { + _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); + } + + public void AddFunction(string functionName, Func function) + { + _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); + } + + public void AddFunction(string functionName, Func function) + { + _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); + } + + public void AddDelegate(string functionName, Delegate function) + { + _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.None)); + } + + public void AddFunction(string functionName, Func, TResult> function) + { + _functions.Add(functionName, new FunctionInfo(function, FunctionFlags.PassThru)); + } + + public bool IsValidFunction(string functionName) + { + return _functions.ContainsKey(functionName); + } + + public OperationResult Execute(FunctionOperation operation) + { + if (!_functions.ContainsKey(operation.FunctionName)) throw new InvalidOperationException(string.Format("Function '{0}' not found.", operation.FunctionName)); + var obj = ((_functions[operation.FunctionName].Flags & FunctionFlags.PassThru) == FunctionFlags.PassThru) ? + _functions[operation.FunctionName].Delegate.DynamicInvoke(operation.Parameters) : + _functions[operation.FunctionName].Delegate.DynamicInvoke(operation.Parameters.Values.ToArray()); + + var dict = obj as IDictionary; + if (dict != null) + { + return new DataResult(EnumerableEx.Once(dict)); + } + + var list = obj as IEnumerable>; + if (list != null) return new DataResult(list); + + var lists = obj as IEnumerable>>; + + if (lists != null) return new MultiDataResult(lists); + + if (obj is int) + { + return new CommandResult((int)obj); + } + + return null; + } + } } \ No newline at end of file diff --git a/Simple.Data/InMemoryAdapterIAdapterWithRelation.cs b/Simple.Data/InMemoryAdapterIAdapterWithRelation.cs index dfd518a3..188a7761 100644 --- a/Simple.Data/InMemoryAdapterIAdapterWithRelation.cs +++ b/Simple.Data/InMemoryAdapterIAdapterWithRelation.cs @@ -9,13 +9,13 @@ public bool IsValidRelation(string tableName, string relatedTableName) { return _joins.Any( ji => - _nameComparer.Equals(tableName, ji.MasterTableName) && - _nameComparer.Equals(relatedTableName, ji.MasterPropertyName)) + _keyComparer.Equals(tableName, ji.MasterTableName) && + _keyComparer.Equals(relatedTableName, ji.MasterPropertyName)) || _joins.Any( ji => - _nameComparer.Equals(tableName, ji.DetailTableName) && - _nameComparer.Equals(relatedTableName, ji.DetailPropertyName)); + _keyComparer.Equals(tableName, ji.DetailTableName) && + _keyComparer.Equals(relatedTableName, ji.DetailPropertyName)); } public object FindRelated(string tableName, IDictionary row, string relatedTableName) @@ -26,8 +26,8 @@ public object FindRelated(string tableName, IDictionary row, str private object FindMaster(string tableName, IDictionary row, string relatedTableName) { var master = _joins.FirstOrDefault(ji => - _nameComparer.Equals(tableName, ji.MasterTableName) && - _nameComparer.Equals(relatedTableName, ji.MasterPropertyName)); + _keyComparer.Equals(tableName, ji.MasterTableName) && + _keyComparer.Equals(relatedTableName, ji.MasterPropertyName)); if (master != null) { object result; @@ -40,8 +40,8 @@ private object FindMaster(string tableName, IDictionary row, str private object FindDetail(string tableName, IDictionary row, string relatedTableName) { var detail = _joins.FirstOrDefault(ji => - _nameComparer.Equals(tableName, ji.DetailTableName) && - _nameComparer.Equals(relatedTableName, ji.DetailPropertyName)); + _keyComparer.Equals(tableName, ji.DetailTableName) && + _keyComparer.Equals(relatedTableName, ji.DetailPropertyName)); if (detail != null) { object result; diff --git a/Simple.Data/InMemoryAdapterIAdapterWithTransactions.cs b/Simple.Data/InMemoryAdapterIAdapterWithTransactions.cs index b5271de7..80ec2cbe 100644 --- a/Simple.Data/InMemoryAdapterIAdapterWithTransactions.cs +++ b/Simple.Data/InMemoryAdapterIAdapterWithTransactions.cs @@ -1,99 +1,53 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using System.Text; -using Simple.Data.Operations; - -namespace Simple.Data -{ - public partial class InMemoryAdapter : IAdapterWithTransactions - { - class InMemoryAdapterTransaction : IAdapterTransaction - { - private readonly string _name; - - public InMemoryAdapterTransaction() : this(string.Empty) - { - } - - public InMemoryAdapterTransaction(string name) - { - _name = name; - } - - public void Dispose() - { - } - - public void Commit() - { - } - - public void Rollback() - { - } - - public string Name - { - get { return _name; } - } - } - - public IAdapterTransaction BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.Unspecified) - { - return new InMemoryAdapterTransaction(); - } - - public IAdapterTransaction BeginTransaction(string name, IsolationLevel isolationLevel = IsolationLevel.Unspecified) - { - return new InMemoryAdapterTransaction(name); - } - - public IEnumerable> Find(FindOperation operation, IAdapterTransaction transaction) - { - return Find(operation); - } - - public IEnumerable> Insert(InsertOperation operation, IAdapterTransaction transaction) - { - return Insert(operation); - } - - public int Update(string tableName, IReadOnlyDictionary data, SimpleExpression criteria, IAdapterTransaction transaction) - { - return Update(tableName, data, criteria); - } - - public int Delete(string tableName, SimpleExpression criteria, IAdapterTransaction transaction) - { - return Delete(tableName, criteria); - } - - public int UpdateMany(string tableName, IEnumerable> dataList, IAdapterTransaction adapterTransaction) - { - return UpdateMany(tableName, dataList); - } - - public int UpdateMany(string tableName, IEnumerable> dataList, IAdapterTransaction adapterTransaction, IList keyFields) - { - return UpdateMany(tableName, dataList, keyFields); - } - - public int UpdateMany(string tableName, IList> dataList, IEnumerable criteriaFieldNames, IAdapterTransaction adapterTransaction) - { - return UpdateMany(tableName, dataList, criteriaFieldNames); - } - - public IEnumerable> RunQuery(SimpleQuery query, IAdapterTransaction transaction, out IEnumerable unhandledClauses) - { - return RunQuery(query, out unhandledClauses); - } - - public IEnumerable> Upsert(UpsertOperation operation, - IAdapterTransaction transaction) - { - throw new NotImplementedException(); - } - } -} +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using Simple.Data.Operations; + +namespace Simple.Data +{ + public partial class InMemoryAdapter : IAdapterWithTransactions + { + class InMemoryAdapterTransaction : IAdapterTransaction + { + private readonly string _name; + + public InMemoryAdapterTransaction() : this(string.Empty) + { + } + + public InMemoryAdapterTransaction(string name) + { + _name = name; + } + + public void Dispose() + { + } + + public void Commit() + { + } + + public void Rollback() + { + } + + public string Name + { + get { return _name; } + } + } + + public IAdapterTransaction BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.Unspecified) + { + return new InMemoryAdapterTransaction(); + } + + public IAdapterTransaction BeginTransaction(string name, IsolationLevel isolationLevel = IsolationLevel.Unspecified) + { + return new InMemoryAdapterTransaction(name); + } + } +} diff --git a/Simple.Data/MultiDataResult.cs b/Simple.Data/MultiDataResult.cs new file mode 100644 index 00000000..1ddaa493 --- /dev/null +++ b/Simple.Data/MultiDataResult.cs @@ -0,0 +1,19 @@ +namespace Simple.Data +{ + using System.Collections.Generic; + + public sealed class MultiDataResult : OperationResult + { + private readonly IEnumerable>> _results; + + public MultiDataResult(IEnumerable>> results) : base(0) + { + _results = results; + } + + public IEnumerable>> Results + { + get { return _results; } + } + } +} \ No newline at end of file diff --git a/Simple.Data/OperationResult.cs b/Simple.Data/OperationResult.cs new file mode 100644 index 00000000..9c9c60b6 --- /dev/null +++ b/Simple.Data/OperationResult.cs @@ -0,0 +1,10 @@ +namespace Simple.Data +{ + public abstract class OperationResult + { + internal OperationResult(int _) + { + + } + } +} \ No newline at end of file diff --git a/Simple.Data/Operations/FindOperation.cs b/Simple.Data/Operations/DeleteOperation.cs similarity index 74% rename from Simple.Data/Operations/FindOperation.cs rename to Simple.Data/Operations/DeleteOperation.cs index 45edb379..8e79fddc 100644 --- a/Simple.Data/Operations/FindOperation.cs +++ b/Simple.Data/Operations/DeleteOperation.cs @@ -1,24 +1,24 @@ -namespace Simple.Data.Operations -{ - public class FindOperation : IOperation - { - private readonly string _tableName; - private readonly SimpleExpression _criteria; - - public FindOperation(string tableName, SimpleExpression criteria) - { - _tableName = tableName; - _criteria = criteria; - } - - public SimpleExpression Criteria - { - get { return _criteria; } - } - - public string TableName - { - get { return _tableName; } - } - } +namespace Simple.Data.Operations +{ + public class DeleteOperation : IOperation + { + private readonly SimpleExpression _criteria; + private readonly string _tableName; + + public DeleteOperation(string tableName, SimpleExpression criteria) + { + _tableName = tableName; + _criteria = criteria; + } + + public SimpleExpression Criteria + { + get { return _criteria; } + } + + public string TableName + { + get { return _tableName; } + } + } } \ No newline at end of file diff --git a/Simple.Data/Operations/GetOperation.cs b/Simple.Data/Operations/GetOperation.cs index 56bd249c..0f85ddcf 100644 --- a/Simple.Data/Operations/GetOperation.cs +++ b/Simple.Data/Operations/GetOperation.cs @@ -1,24 +1,48 @@ -namespace Simple.Data.Operations -{ - public class GetOperation : IOperation - { - private readonly string _tableName; - private readonly object[] _keyValues; - - public GetOperation(string tableName, object[] keyValues) - { - _tableName = tableName; - _keyValues = keyValues; - } - - public object[] KeyValues - { - get { return _keyValues; } - } - - public string TableName - { - get { return _tableName; } - } - } +namespace Simple.Data.Operations +{ + using System.Collections.Generic; + + public class GetOperation : IOperation + { + private readonly string _tableName; + private readonly object[] _keyValues; + + public GetOperation(string tableName, object[] keyValues) + { + _tableName = tableName; + _keyValues = keyValues; + } + + public object[] KeyValues + { + get { return _keyValues; } + } + + public string TableName + { + get { return _tableName; } + } + } + + public class FunctionOperation : IOperation + { + private readonly string _functionName; + private readonly IReadOnlyDictionary _parameters; + + public string FunctionName + { + get { return _functionName; } + } + + public IReadOnlyDictionary Parameters + { + get { return _parameters; } + } + + public FunctionOperation(string functionName, IReadOnlyDictionary parameters) + { + _functionName = functionName; + _parameters = parameters; + } + } } \ No newline at end of file diff --git a/Simple.Data/Operations/InsertOperation.cs b/Simple.Data/Operations/InsertOperation.cs index b92ea38a..8ca00d43 100644 --- a/Simple.Data/Operations/InsertOperation.cs +++ b/Simple.Data/Operations/InsertOperation.cs @@ -1,65 +1,65 @@ -namespace Simple.Data.Operations -{ - using System.Collections.Generic; - using System.Collections.ObjectModel; - using System.Linq; - - public class InsertOperation - { - private readonly IEnumerable> _data; - private readonly bool _resultRequired; - private readonly string _tableName; - private readonly ErrorCallback _errorCallback; - - public InsertOperation(string tableName, IDictionary data, bool resultRequired, ErrorCallback errorCallback = null) - : this(tableName, resultRequired, errorCallback) - { - _data = EnumerableEx.Once(new ReadOnlyDictionary(data)); - } - - public InsertOperation(string tableName, IReadOnlyDictionary data, bool resultRequired, ErrorCallback errorCallback = null) - : this(tableName, resultRequired, errorCallback) - { - _data = EnumerableEx.Once(data); - } - - public InsertOperation(string tableName, IEnumerable> data, bool resultRequired, ErrorCallback errorCallback = null) - : this(tableName, resultRequired, errorCallback) - { - _data = data.Select(d => new ReadOnlyDictionary(d)); - } - - public InsertOperation(string tableName, bool resultRequired, ErrorCallback errorCallback) - { - _tableName = tableName; - _resultRequired = resultRequired; - _errorCallback = errorCallback ?? ((item, exception) => true) ; - } - - public InsertOperation(string tableName, IEnumerable> data, bool resultRequired, ErrorCallback errorCallback = null) - : this(tableName, resultRequired, errorCallback) - { - _data = data; - } - - public bool ResultRequired - { - get { return _resultRequired; } - } - - public string TableName - { - get { return _tableName; } - } - - public IEnumerable> Data - { - get { return _data; } - } - - public ErrorCallback ErrorCallback - { - get { return _errorCallback; } - } - } +namespace Simple.Data.Operations +{ + using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.Linq; + + public class InsertOperation : IOperation + { + private readonly IEnumerable> _data; + private readonly bool _resultRequired; + private readonly string _tableName; + private readonly ErrorCallback _errorCallback; + + public InsertOperation(string tableName, IDictionary data, bool resultRequired, ErrorCallback errorCallback = null) + : this(tableName, resultRequired, errorCallback) + { + _data = EnumerableEx.Once(new ReadOnlyDictionary(data)); + } + + public InsertOperation(string tableName, IReadOnlyDictionary data, bool resultRequired, ErrorCallback errorCallback = null) + : this(tableName, resultRequired, errorCallback) + { + _data = EnumerableEx.Once(data); + } + + public InsertOperation(string tableName, IEnumerable> data, bool resultRequired, ErrorCallback errorCallback = null) + : this(tableName, resultRequired, errorCallback) + { + _data = data.Select(d => new ReadOnlyDictionary(d)); + } + + public InsertOperation(string tableName, bool resultRequired, ErrorCallback errorCallback) + { + _tableName = tableName; + _resultRequired = resultRequired; + _errorCallback = errorCallback ?? ((item, exception) => true) ; + } + + public InsertOperation(string tableName, IEnumerable> data, bool resultRequired, ErrorCallback errorCallback = null) + : this(tableName, resultRequired, errorCallback) + { + _data = data; + } + + public bool ResultRequired + { + get { return _resultRequired; } + } + + public string TableName + { + get { return _tableName; } + } + + public IEnumerable> Data + { + get { return _data; } + } + + public ErrorCallback ErrorCallback + { + get { return _errorCallback; } + } + } } \ No newline at end of file diff --git a/Simple.Data/Operations/QueryOperation.cs b/Simple.Data/Operations/QueryOperation.cs new file mode 100644 index 00000000..6c85e59f --- /dev/null +++ b/Simple.Data/Operations/QueryOperation.cs @@ -0,0 +1,22 @@ +namespace Simple.Data.Operations +{ + public class QueryOperation : IOperation + { + private readonly SimpleQuery _query; + + internal QueryOperation(DataStrategy dataStrategy, string tableName, SimpleExpression criteria) + { + _query = new SimpleQuery(dataStrategy, tableName).Where(criteria); + } + + internal QueryOperation(SimpleQuery query) + { + _query = query; + } + + public SimpleQuery Query + { + get { return _query; } + } + } +} \ No newline at end of file diff --git a/Simple.Data/Operations/UpdateByCriteriaOperation.cs b/Simple.Data/Operations/UpdateByCriteriaOperation.cs new file mode 100644 index 00000000..51b06060 --- /dev/null +++ b/Simple.Data/Operations/UpdateByCriteriaOperation.cs @@ -0,0 +1,33 @@ +namespace Simple.Data.Operations +{ + using System.Collections.Generic; + + public class UpdateByCriteriaOperation : IOperation + { + private readonly string _tableName; + private readonly SimpleExpression _criteria; + private readonly IReadOnlyDictionary _data; + + public string TableName + { + get { return _tableName; } + } + + public SimpleExpression Criteria + { + get { return _criteria; } + } + + public IReadOnlyDictionary Data + { + get { return _data; } + } + + public UpdateByCriteriaOperation(string tableName, SimpleExpression criteria, IReadOnlyDictionary data) + { + _tableName = tableName; + _criteria = criteria; + _data = data; + } + } +} \ No newline at end of file diff --git a/Simple.Data/Operations/UpdateEntityOperation.cs b/Simple.Data/Operations/UpdateEntityOperation.cs new file mode 100644 index 00000000..7c4f23d4 --- /dev/null +++ b/Simple.Data/Operations/UpdateEntityOperation.cs @@ -0,0 +1,39 @@ +namespace Simple.Data.Operations +{ + using System.Collections.Generic; + + public class UpdateEntityOperation : IOperation + { + private readonly string _tableName; + private readonly IEnumerable> _data; + private readonly IEnumerable> _originals; + + public UpdateEntityOperation(string tableName, IReadOnlyDictionary data, IReadOnlyDictionary original = null) + : this(tableName, EnumerableEx.Once(data), original == null ? null : EnumerableEx.Once(original)) + { + + } + + public UpdateEntityOperation(string tableName, IEnumerable> data, IEnumerable> originals = null) + { + _tableName = tableName; + _data = data; + _originals = originals; + } + + public string TableName + { + get { return _tableName; } + } + + public IEnumerable> Data + { + get { return _data; } + } + + public IEnumerable> Originals + { + get { return _originals; } + } + } +} \ No newline at end of file diff --git a/Simple.Data/Operations/UpsertOperation.cs b/Simple.Data/Operations/UpsertOperation.cs index 876fc3f3..82669a5a 100644 --- a/Simple.Data/Operations/UpsertOperation.cs +++ b/Simple.Data/Operations/UpsertOperation.cs @@ -1,94 +1,72 @@ -namespace Simple.Data.Operations -{ - using System.Collections.Generic; - using System.Collections.ObjectModel; - using System.Linq; - - public class UpsertOperation - { - private readonly IEnumerable> _data; - private readonly bool _resultRequired; - private readonly string _tableName; - private readonly string[] _byFieldNames; - private readonly ErrorCallback _errorCallback; - - public UpsertOperation(string tableName, IDictionary data, bool resultRequired, string[] byFieldNames = null, ErrorCallback errorCallback = null) - : this(tableName, resultRequired, byFieldNames, errorCallback) - { - _data = EnumerableEx.Once(new ReadOnlyDictionary(data)); - } - - public UpsertOperation(string tableName, IReadOnlyDictionary data, bool resultRequired, string[] byFieldNames = null, ErrorCallback errorCallback = null) - : this(tableName, resultRequired, byFieldNames, errorCallback) - { - _data = EnumerableEx.Once(data); - } - - public UpsertOperation(string tableName, IEnumerable> data, bool resultRequired, string[] byFieldNames = null, ErrorCallback errorCallback = null) - : this(tableName, resultRequired, byFieldNames, errorCallback) - { - _data = data.Select(d => new ReadOnlyDictionary(d)); - } - - public UpsertOperation(string tableName, bool resultRequired, string[] byFieldNames = null, ErrorCallback errorCallback = null) - { - _tableName = tableName; - _resultRequired = resultRequired; - _byFieldNames = byFieldNames; - _errorCallback = errorCallback ?? ((item, exception) => true) ; - } - - public UpsertOperation(string tableName, IEnumerable> data, bool resultRequired, string[] byFieldNames = null, ErrorCallback errorCallback = null) - : this(tableName, resultRequired, byFieldNames, errorCallback) - { - _data = data; - } - - public bool ResultRequired - { - get { return _resultRequired; } - } - - public string TableName - { - get { return _tableName; } - } - - public IEnumerable> Data - { - get { return _data; } - } - - public ErrorCallback ErrorCallback - { - get { return _errorCallback; } - } - - public string[] ByFieldNames - { - get { return _byFieldNames; } - } - } - - public class UpdateOperation - { - private readonly string _tableName; - private readonly IReadOnlyDictionary _data; - - public UpdateOperation(string tableName, IReadOnlyDictionary data) - { - _tableName = tableName; - _data = data; - } - - public string TableName - { - get { return _tableName; } - } - - public IReadOnlyDictionary Data - { - get { return _data; } - } - } +namespace Simple.Data.Operations +{ + using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.Linq; + + public class UpsertOperation : IOperation + { + private readonly IEnumerable> _data; + private readonly bool _resultRequired; + private readonly string _tableName; + private readonly string[] _byFieldNames; + private readonly ErrorCallback _errorCallback; + + public UpsertOperation(string tableName, IDictionary data, bool resultRequired, string[] byFieldNames = null, ErrorCallback errorCallback = null) + : this(tableName, resultRequired, byFieldNames, errorCallback) + { + _data = EnumerableEx.Once(new ReadOnlyDictionary(data)); + } + + public UpsertOperation(string tableName, IReadOnlyDictionary data, bool resultRequired, string[] byFieldNames = null, ErrorCallback errorCallback = null) + : this(tableName, resultRequired, byFieldNames, errorCallback) + { + _data = EnumerableEx.Once(data); + } + + public UpsertOperation(string tableName, IEnumerable> data, bool resultRequired, string[] byFieldNames = null, ErrorCallback errorCallback = null) + : this(tableName, resultRequired, byFieldNames, errorCallback) + { + _data = data.Select(d => new ReadOnlyDictionary(d)); + } + + public UpsertOperation(string tableName, bool resultRequired, string[] byFieldNames = null, ErrorCallback errorCallback = null) + { + _tableName = tableName; + _resultRequired = resultRequired; + _byFieldNames = byFieldNames; + _errorCallback = errorCallback ?? ((item, exception) => true) ; + } + + public UpsertOperation(string tableName, IEnumerable> data, bool resultRequired, string[] byFieldNames = null, ErrorCallback errorCallback = null) + : this(tableName, resultRequired, byFieldNames, errorCallback) + { + _data = data; + } + + public bool ResultRequired + { + get { return _resultRequired; } + } + + public string TableName + { + get { return _tableName; } + } + + public IEnumerable> Data + { + get { return _data; } + } + + public ErrorCallback ErrorCallback + { + get { return _errorCallback; } + } + + public string[] ByFieldNames + { + get { return _byFieldNames; } + } + } } \ No newline at end of file diff --git a/Simple.Data/OptimizingDelegateFactory.cs b/Simple.Data/OptimizingDelegateFactory.cs deleted file mode 100644 index 472a7e59..00000000 --- a/Simple.Data/OptimizingDelegateFactory.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Simple.Data.Operations; - -namespace Simple.Data -{ - public abstract class OptimizingDelegateFactory - { - public virtual Func> CreateFindOneDelegate(Adapter adapter, string tableName, SimpleExpression criteria) - { - return adapter.CreateFindOneDelegate(tableName, criteria); - } - - public virtual Func> CreateGetDelegate(Adapter adapter, GetOperation operation) - { - return args => adapter.Get(operation); - } - } - - internal class DefaultOptimizingDelegateFactory : OptimizingDelegateFactory - { - - } -} \ No newline at end of file diff --git a/Simple.Data/QueryResult.cs b/Simple.Data/QueryResult.cs new file mode 100644 index 00000000..0a6234d2 --- /dev/null +++ b/Simple.Data/QueryResult.cs @@ -0,0 +1,27 @@ +namespace Simple.Data +{ + using System.Collections.Generic; + using System.Linq; + + public sealed class QueryResult : OperationResult + { + private readonly IEnumerable> _data; + private readonly IEnumerable _unhandledClauses; + + public IEnumerable> Data + { + get { return _data; } + } + + public IEnumerable UnhandledClauses + { + get { return _unhandledClauses; } + } + + public QueryResult(IEnumerable> data, IEnumerable unhandledClauses = null) : base(0) + { + _data = data; + _unhandledClauses = unhandledClauses ?? Enumerable.Empty(); + } + } +} \ No newline at end of file diff --git a/Simple.Data/RunStrategy.cs b/Simple.Data/RunStrategy.cs index 8f3aa79a..821d71d2 100644 --- a/Simple.Data/RunStrategy.cs +++ b/Simple.Data/RunStrategy.cs @@ -1,87 +1,47 @@ -using Simple.Data.Operations; - -namespace Simple.Data -{ - using System.Collections.Generic; - using System.Linq; - - internal abstract class RunStrategy - { - protected abstract Adapter Adapter { get; } - - /// - /// Finds data from the specified "table". - /// - /// Name of the table. - /// The criteria. This may be null, in which case all records should be returned. - /// The list of records matching the criteria. If no records are found, return an empty list. - internal abstract IEnumerable> Find(FindOperation operation); - - /// - /// Inserts many records into the specified "table". - /// - /// - /// Name of the table.The values to insert.If possible, return the newly inserted row, including any automatically-set values such as primary keys or timestamps. - internal abstract IEnumerable> Insert(InsertOperation operation); - - /// - /// Updates the specified "table" according to specified criteria. - /// Name of the table.The new values.The expression to use as criteria for the update operation.The number of records affected by the update operation. - internal abstract int Update(string tableName, IReadOnlyDictionary newValuesDict, IReadOnlyDictionary originalValuesDict); - - internal abstract int Update(string tableName, IReadOnlyDictionary data, SimpleExpression criteria); - - /// - /// Deletes from the specified table. - /// Name of the table.The expression to use as criteria for the delete operation.The number of records which were deleted. - internal abstract int Delete(string tableName, SimpleExpression criteria); - - internal abstract IReadOnlyDictionary FindOne(FindOperation operation); - - internal abstract int UpdateMany(string tableName, IList> list); - - internal abstract int UpdateMany(string tableName, IList> dataList, IEnumerable criteriaFieldNames); - - internal abstract int UpdateMany(string tableName, IList> newValuesList, - IList> originalValuesList); - - public abstract IEnumerable> Upsert(UpsertOperation operation); - - public abstract IReadOnlyDictionary Get(GetOperation operation); - - public abstract IEnumerable> RunQuery(SimpleQuery query, out IEnumerable unhandledClauses); - - protected static Dictionary CreateChangedValuesDict( - IEnumerable> newValuesDict, IReadOnlyDictionary originalValuesDict) - { - var changedValuesDict = - newValuesDict.Where( - kvp => - (!originalValuesDict.ContainsKey(kvp.Key)) || !(Equals(kvp.Value, originalValuesDict[kvp.Key]))) - .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); - return changedValuesDict; - } - - protected SimpleExpression CreateCriteriaFromOriginalValues(string tableName, - IReadOnlyDictionary newValuesDict, - IReadOnlyDictionary - originalValuesDict) - { - var criteriaValues = Adapter.GetKey(tableName, originalValuesDict).ToDictionary(); - - foreach (var kvp in originalValuesDict - .Where( - originalKvp => - newValuesDict.ContainsKey(originalKvp.Key) && - !(Equals(newValuesDict[originalKvp.Key], originalKvp.Value)))) - { - if (!criteriaValues.ContainsKey(kvp.Key)) - { - criteriaValues.Add(kvp); - } - }; - - return ExpressionHelper.CriteriaDictionaryToExpression(tableName, criteriaValues); - } - } +using Simple.Data.Operations; + +namespace Simple.Data +{ + using System.Collections.Generic; + using System.Linq; + + internal abstract class RunStrategy + { + protected abstract Adapter Adapter { get; } + + internal abstract OperationResult Execute(IOperation operation); + + protected static Dictionary CreateChangedValuesDict( + IEnumerable> newValuesDict, IReadOnlyDictionary originalValuesDict) + { + var changedValuesDict = + newValuesDict.Where( + kvp => + (!originalValuesDict.ContainsKey(kvp.Key)) || !(Equals(kvp.Value, originalValuesDict[kvp.Key]))) + .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); + return changedValuesDict; + } + + protected SimpleExpression CreateCriteriaFromOriginalValues(string tableName, + IReadOnlyDictionary newValuesDict, + IReadOnlyDictionary + originalValuesDict) + { + var criteriaValues = Adapter.GetKey(tableName, originalValuesDict).ToDictionary(); + + foreach (var kvp in originalValuesDict + .Where( + originalKvp => + newValuesDict.ContainsKey(originalKvp.Key) && + !(Equals(newValuesDict[originalKvp.Key], originalKvp.Value)))) + { + if (!criteriaValues.ContainsKey(kvp.Key)) + { + criteriaValues.Add(kvp); + } + }; + + return ExpressionHelper.CriteriaDictionaryToExpression(tableName, criteriaValues); + } + } } \ No newline at end of file diff --git a/Simple.Data/Simple.Data.csproj b/Simple.Data/Simple.Data.csproj index 1486f113..f04a7ed7 100644 --- a/Simple.Data/Simple.Data.csproj +++ b/Simple.Data/Simple.Data.csproj @@ -1,233 +1,239 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Library - Properties - Simple.Data - Simple.Data - 512 - - - - - - - - - v4.5 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - SecurityRules.ruleset - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - - - - - - - - - - CommonAssemblyInfo.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Library + Properties + Simple.Data + Simple.Data + 512 + + + + + + + + + v4.5 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + SecurityRules.ruleset + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + + CommonAssemblyInfo.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + \ No newline at end of file diff --git a/Simple.Data/SimpleQuery.cs b/Simple.Data/SimpleQuery.cs index 81496cef..87928351 100644 --- a/Simple.Data/SimpleQuery.cs +++ b/Simple.Data/SimpleQuery.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using Commands; using Extensions; + using Operations; using QueryPolyfills; public class SimpleQuery : DynamicObject, IEnumerable @@ -314,18 +315,18 @@ public SimpleQuery ClearWithTotalCount() protected IEnumerable Run() { IEnumerable unhandledClauses; - var result = _dataStrategy.Run.RunQuery(this, out unhandledClauses); + var result = (QueryResult)_dataStrategy.Run.Execute(new QueryOperation(this)); - if (unhandledClauses != null) + if (result.UnhandledClauses != null) { - var unhandledClausesList = unhandledClauses.ToList(); + var unhandledClausesList = result.UnhandledClauses.ToList(); if (unhandledClausesList.Count > 0) { - result = new DictionaryQueryRunner(_tableName, result, unhandledClausesList).Run(); + result = new QueryResult(new DictionaryQueryRunner(_tableName, result.Data, unhandledClausesList).Run()); } } - return SimpleResultSet.Create(result, _tableName, _dataStrategy).Cast(); + return SimpleResultSet.Create(result.Data, _tableName, _dataStrategy).Cast(); } public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) @@ -894,25 +895,7 @@ public void SetDataStrategy(DataStrategy dataStrategy) public IObservable AsObservable() { - if (_asObservableImplementation != null) return _asObservableImplementation(); - - try - { - _asObservableImplementation = () => - { - IEnumerable unhandledClauses; - return _adapter.RunQueryAsObservable(this, out unhandledClauses) - .Map(d => new SimpleRecord(d, _tableName, _dataStrategy)); - }; - return _asObservableImplementation(); - } - catch (NotImplementedException) - { - _asObservableImplementation = - () => Run().Select(d => new SimpleRecord(d, _tableName, _dataStrategy)).ToObservable(); - } - - return _asObservableImplementation(); + throw new NotImplementedException(); } public Task> RunTask() diff --git a/Simple.Data/SimpleRecord.cs b/Simple.Data/SimpleRecord.cs index 6e40dd18..8af28aaf 100644 --- a/Simple.Data/SimpleRecord.cs +++ b/Simple.Data/SimpleRecord.cs @@ -1,194 +1,169 @@ -using System; -using System.Collections.Generic; -using System.Dynamic; -using System.Linq; -using System.Text; -using System.Threading; -using Simple.Data.Extensions; - -namespace Simple.Data -{ - public partial class SimpleRecord : DynamicObject, ICloneable - { - private static readonly DictionaryCloner Cloner = new DictionaryCloner(); - private readonly ConcreteObject _concreteObject = new ConcreteObject(); - private readonly IDictionary _data; - private readonly DataStrategy _database; - private readonly string _tableName; - - public SimpleRecord() - { - _data = new Dictionary(HomogenizedEqualityComparer.DefaultInstance); - } - - public SimpleRecord(DataStrategy database) - { - _data = new Dictionary(HomogenizedEqualityComparer.DefaultInstance); - _database = database; - } - - public SimpleRecord(IReadOnlyDictionary data) - : this(data, null) - { - } - - public SimpleRecord(IReadOnlyDictionary data, string tableName) - : this(data, tableName, null) - { - } - - public SimpleRecord(IReadOnlyDictionary data, string tableName, DataStrategy dataStrategy) - { - _tableName = tableName; - _database = dataStrategy; - if (data == null) - { - _data = new Dictionary(); - } - else - { - _data = data as IDictionary || data.ToDictionary(); - } - } - - - public SimpleRecord(IDictionary data) - : this(data, null) - { - } - - public SimpleRecord(IDictionary data, string tableName) - : this(data, tableName, null) - { - } - - public SimpleRecord(IDictionary data, string tableName, DataStrategy dataStrategy) - { - _tableName = tableName; - _database = dataStrategy; - _data = data ?? new Dictionary(); - } - - public override bool TryGetMember(GetMemberBinder binder, out object result) - { - if (_data.ContainsKey(binder.Name)) - { - result = _data[binder.Name]; - var converted = ConvertResult(result); - if (!ReferenceEquals(result, converted)) - _data[binder.Name] = result = converted; - - return true; - } - - if (_tableName == null) - { - result = null; - return false; - } - - if (_database != null) - { - try - { - var relatedAdapter = _database.GetAdapter() as IAdapterWithRelation; - if (relatedAdapter != null && relatedAdapter.IsValidRelation(_tableName, binder.Name)) - { - result = GetRelatedData(binder, relatedAdapter); - return true; - } - } - catch (UnresolvableObjectException e) - { - throw new UnresolvableObjectException(e.ObjectName, string.Format("Column '{0}' not found.", e.ObjectName), e); - } - } - return base.TryGetMember(binder, out result); - } - - private object GetRelatedData(GetMemberBinder binder, IAdapterWithRelation relatedAdapter) - { - object result; - var related = relatedAdapter.FindRelated(_tableName, _data, binder.Name); - var query = related as SimpleQuery; - if (query != null) - { - query.SetDataStrategy(_database); - result = query; - } - else - { - result = related is IDictionary - ? (object) new SimpleRecord(related as IDictionary, binder.Name, _database) - : ((IEnumerable>) related).Select( - dict => new SimpleRecord(dict, binder.Name, _database)).ToList(); - _data[binder.Name] = result; - - } - return result; - } - - public override bool TrySetMember(SetMemberBinder binder, object value) - { - _data[binder.Name] = value; - return true; - } - - public override bool TryConvert(ConvertBinder binder, out object result) - { - result = _concreteObject.Get(binder.Type, _data); - return result != null; - } - - public override IEnumerable GetDynamicMemberNames() - { - return _data.Keys.AsEnumerable(); - } - - private object ConvertResult(object result) - { - if (result is SimpleList || result is SimpleRecord) return result; - - var subRecord = result as IDictionary; - if (subRecord != null) - return new SimpleRecord(subRecord); - - var list = result as IEnumerable; - if (list != null) - { - return new SimpleList(list.Select(ConvertResult)); - } - - var func = result as Func, object>; - if (func != null) - { - result = func(_data); - } - - return result; - } - - /// - /// Creates a new object that is a copy of the current instance. - /// - /// - /// A new object that is a copy of this instance. - /// - public object Clone() - { - return new SimpleRecord(Cloner.CloneDictionary(_data), _tableName, _database); - } - - public object ToScalar() - { - if (_data == null || _data.Count == 0) return null; - return _data.First().Value; - } - - public T ToScalar() - { - if (_data == null || _data.Count == 0) return default(T); - return (T)_data.First().Value; - } - } +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Text; +using System.Threading; +using Simple.Data.Extensions; + +namespace Simple.Data +{ + public partial class SimpleRecord : DynamicObject, ICloneable + { + private static readonly DictionaryCloner Cloner = new DictionaryCloner(); + private readonly ConcreteObject _concreteObject = new ConcreteObject(); + private readonly IDictionary _data; + private readonly DataStrategy _database; + private readonly string _tableName; + + public SimpleRecord() + { + _data = new Dictionary(HomogenizedEqualityComparer.DefaultInstance); + } + + public SimpleRecord(DataStrategy database) + { + _data = new Dictionary(HomogenizedEqualityComparer.DefaultInstance); + _database = database; + } + + public SimpleRecord(IDictionary data) + : this(data, null) + { + } + + public SimpleRecord(IDictionary data, string tableName) + : this(data, tableName, null) + { + } + + public SimpleRecord(IDictionary data, string tableName, DataStrategy dataStrategy) + { + _tableName = tableName; + _database = dataStrategy; + _data = data ?? new Dictionary(); + } + + public override bool TryGetMember(GetMemberBinder binder, out object result) + { + if (_data.ContainsKey(binder.Name)) + { + result = _data[binder.Name]; + var converted = ConvertResult(result); + if (!ReferenceEquals(result, converted)) + _data[binder.Name] = result = converted; + + return true; + } + + if (_tableName == null) + { + result = null; + return false; + } + + if (_database != null) + { + try + { + var relatedAdapter = _database.GetAdapter() as IAdapterWithRelation; + if (relatedAdapter != null && relatedAdapter.IsValidRelation(_tableName, binder.Name)) + { + result = GetRelatedData(binder, relatedAdapter); + return true; + } + } + catch (UnresolvableObjectException e) + { + throw new UnresolvableObjectException(e.ObjectName, string.Format("Column '{0}' not found.", e.ObjectName), e); + } + } + return base.TryGetMember(binder, out result); + } + + private object GetRelatedData(GetMemberBinder binder, IAdapterWithRelation relatedAdapter) + { + object result; + var related = relatedAdapter.FindRelated(_tableName, _data, binder.Name); + var query = related as SimpleQuery; + if (query != null) + { + query.SetDataStrategy(_database); + result = query; + } + else + { + result = related is IDictionary + ? (object) new SimpleRecord(related as IDictionary, binder.Name, _database) + : ((IEnumerable>) related).Select( + dict => new SimpleRecord(dict, binder.Name, _database)).ToList(); + _data[binder.Name] = result; + + } + return result; + } + + public override bool TrySetMember(SetMemberBinder binder, object value) + { + _data[binder.Name] = value; + return true; + } + + public override bool TryConvert(ConvertBinder binder, out object result) + { + result = _concreteObject.Get(binder.Type, _data); + return result != null; + } + + public override IEnumerable GetDynamicMemberNames() + { + return _data.Keys.AsEnumerable(); + } + + private object ConvertResult(object result) + { + if (result is SimpleList || result is SimpleRecord) return result; + + var subRecord = result as IDictionary; + if (subRecord != null) + return new SimpleRecord(subRecord); + + var list = result as IEnumerable; + if (list != null) + { + return new SimpleList(list.Select(ConvertResult)); + } + + var func = result as Func, object>; + if (func != null) + { + result = func(_data); + } + + return result; + } + + /// + /// Creates a new object that is a copy of the current instance. + /// + /// + /// A new object that is a copy of this instance. + /// + public object Clone() + { + return new SimpleRecord(Cloner.CloneDictionary(_data), _tableName, _database); + } + + public object ToScalar() + { + if (_data == null || _data.Count == 0) return null; + return _data.First().Value; + } + + public T ToScalar() + { + if (_data == null || _data.Count == 0) return default(T); + return (T)_data.First().Value; + } + } } \ No newline at end of file diff --git a/Simple.Data/TransactionRunner.cs b/Simple.Data/TransactionRunner.cs index d48d044b..4b28202e 100644 --- a/Simple.Data/TransactionRunner.cs +++ b/Simple.Data/TransactionRunner.cs @@ -1,86 +1,29 @@ -using Simple.Data.Operations; - -namespace Simple.Data -{ - using System.Collections.Generic; - using System.Linq; - - internal class TransactionRunner : RunStrategy - { - private readonly IAdapterWithTransactions _adapter; - private readonly IAdapterTransaction _adapterTransaction; - - public TransactionRunner(IAdapterWithTransactions adapter, IAdapterTransaction adapterTransaction) - { - _adapter = adapter; - _adapterTransaction = adapterTransaction; - } - - protected override Adapter Adapter - { - get { return (Adapter) _adapter; } - } - - internal override IReadOnlyDictionary FindOne(FindOperation operation) - { - return Find(operation).FirstOrDefault(); - } - - internal override int UpdateMany(string tableName, IList> dataList) - { - return _adapter.UpdateMany(tableName, dataList, _adapterTransaction); - } - - internal override int UpdateMany(string tableName, IList> dataList, IEnumerable criteriaFieldNames) - { - return _adapter.UpdateMany(tableName, dataList, criteriaFieldNames, _adapterTransaction); - } - - internal override int UpdateMany(string tableName, IList> newValuesList, IList> originalValuesList) - { - throw new System.NotImplementedException(); - } - - internal override IEnumerable> Find(FindOperation operation) - { - return _adapter.Find(operation, _adapterTransaction); - } - - internal override IEnumerable> Insert(InsertOperation operation) - { - return _adapter.Insert(operation, _adapterTransaction); - } - - internal override int Update(string tableName, IReadOnlyDictionary data, SimpleExpression criteria) - { - return _adapter.Update(tableName, data, criteria, _adapterTransaction); - } - - public override IEnumerable> Upsert(UpsertOperation operation) - { - return _adapter.Upsert(operation, _adapterTransaction); - } - - public override IReadOnlyDictionary Get(GetOperation operation) - { - return _adapter.Get(operation, _adapterTransaction); - } - - public override IEnumerable> RunQuery(SimpleQuery query, out IEnumerable unhandledClauses) - { - return _adapter.RunQuery(query, _adapterTransaction, out unhandledClauses); - } - - internal override int Update(string tableName, IReadOnlyDictionary newValuesDict, IReadOnlyDictionary originalValuesDict) - { - SimpleExpression criteria = CreateCriteriaFromOriginalValues(tableName, newValuesDict, originalValuesDict); - var changedValuesDict = CreateChangedValuesDict(newValuesDict, originalValuesDict); - return _adapter.Update(tableName, changedValuesDict, criteria, _adapterTransaction); - } - - internal override int Delete(string tableName, SimpleExpression criteria) - { - return _adapter.Delete(tableName, criteria, _adapterTransaction); - } - } +using Simple.Data.Operations; + +namespace Simple.Data +{ + using System.Collections.Generic; + using System.Linq; + + internal class TransactionRunner : RunStrategy + { + private readonly IAdapterWithTransactions _adapter; + private readonly IAdapterTransaction _adapterTransaction; + + public TransactionRunner(IAdapterWithTransactions adapter, IAdapterTransaction adapterTransaction) + { + _adapter = adapter; + _adapterTransaction = adapterTransaction; + } + + protected override Adapter Adapter + { + get { return (Adapter) _adapter; } + } + + internal override OperationResult Execute(IOperation operation) + { + return _adapter.Execute(operation, _adapterTransaction); + } + } } \ No newline at end of file From 0e7eba70dd98558706dee5928c8b27a17b69e181 Mon Sep 17 00:00:00 2001 From: Mark Rendle Date: Tue, 24 Sep 2013 13:23:36 +0100 Subject: [PATCH 03/15] Query and Insert working --- .../AdoAdapter.IAdapterWithTransactions.cs | 14 - Simple.Data.Ado/AdoAdapter.cs | 23 +- Simple.Data.Ado/AdoAdapterInserter.cs | 2 +- Simple.Data.Ado/BulkInserter.cs | 4 +- Simple.Data.Ado/BulkInserterHelper.cs | 24 +- .../BulkInserterTransactionHelper.cs | 8 +- Simple.Data.Ado/ExecutorFactory.cs | 58 ++++ Simple.Data.Ado/IBulkInserter.cs | 2 +- Simple.Data.Ado/Simple.Data.Ado.csproj | 1 + .../TraceSettingsTest.cs | 2 + Simple.Data.SqlServer/SqlBulkInserter.cs | 4 +- Simple.Data.UnitTest/CheckedEnumerableTest.cs | 71 +++++ .../Simple.Data.UnitTest.csproj | 275 +++++++++--------- Simple.Data/CheckedEnumerable.cs | 157 ++++++++++ Simple.Data/DataResult.cs | 8 + Simple.Data/Simple.Data.csproj | 1 + 16 files changed, 473 insertions(+), 181 deletions(-) create mode 100644 Simple.Data.Ado/ExecutorFactory.cs create mode 100644 Simple.Data.UnitTest/CheckedEnumerableTest.cs create mode 100644 Simple.Data/CheckedEnumerable.cs diff --git a/Simple.Data.Ado/AdoAdapter.IAdapterWithTransactions.cs b/Simple.Data.Ado/AdoAdapter.IAdapterWithTransactions.cs index 65b3a278..0c51c436 100644 --- a/Simple.Data.Ado/AdoAdapter.IAdapterWithTransactions.cs +++ b/Simple.Data.Ado/AdoAdapter.IAdapterWithTransactions.cs @@ -32,20 +32,6 @@ public IAdapterTransaction BeginTransaction(string name, IsolationLevel isolatio return new AdoAdapterTransaction(transaction, name, _sharedConnection != null); } - public OperationResult Execute(IOperation operation, IAdapterTransaction transaction) - { - throw new NotImplementedException(); - } - - public IEnumerable> InsertMany(string tableName, - IEnumerable> data, - IAdapterTransaction transaction, - Func, Exception, bool> onError, bool resultRequired) - { - return new AdoAdapterInserter(this, ((AdoAdapterTransaction)transaction).DbTransaction).InsertMany( - tableName, data, onError, resultRequired); - } - public int UpdateMany(string tableName, IEnumerable> data, IAdapterTransaction transaction) { diff --git a/Simple.Data.Ado/AdoAdapter.cs b/Simple.Data.Ado/AdoAdapter.cs index be613927..0bcd477e 100644 --- a/Simple.Data.Ado/AdoAdapter.cs +++ b/Simple.Data.Ado/AdoAdapter.cs @@ -14,6 +14,7 @@ namespace Simple.Data.Ado [Export("Ado", typeof (Adapter))] public partial class AdoAdapter : Adapter, ICloneable { + private readonly ExecutorFactory _executorFactory = new ExecutorFactory(); private readonly AdoAdapterFinder _finder; private readonly ProviderHelper _providerHelper = new ProviderHelper(); private CommandOptimizer _commandOptimizer = new CommandOptimizer(); @@ -141,7 +142,20 @@ private AdoAdapterRelatedFinder CreateRelatedFinder() public override OperationResult Execute(IOperation operation) { - throw new NotImplementedException(); + return Execute(operation, null); + } + + public OperationResult Execute(IOperation operation, IAdapterTransaction transaction) + { + if (operation == null) throw new ArgumentNullException("operation"); + + Func func; + if (_executorFactory.TryGet(operation, out func)) + { + return func(operation, this, null); + } + + throw new NotSupportedException(string.Format("Operation '{0}' is not supported by the current database.", operation.GetType().Name)); } public OperationResult Execute(FunctionOperation operation) @@ -217,13 +231,6 @@ private IDictionary Insert(string tableName, IDictionary> InsertMany(string tableName, - IEnumerable> - data, Func, Exception, bool> onError, bool resultRequired) - { - return new AdoAdapterInserter(this).InsertMany(tableName, data, onError, resultRequired); - } - private int UpdateMany(string tableName, IEnumerable> data, IEnumerable criteriaFieldNames) { diff --git a/Simple.Data.Ado/AdoAdapterInserter.cs b/Simple.Data.Ado/AdoAdapterInserter.cs index 46afd760..9d1c3d8b 100644 --- a/Simple.Data.Ado/AdoAdapterInserter.cs +++ b/Simple.Data.Ado/AdoAdapterInserter.cs @@ -32,7 +32,7 @@ public AdoAdapterInserter(AdoAdapter adapter, IDbTransaction transaction) if (transaction != null) _connection = transaction.Connection; } - public IEnumerable> InsertMany(string tableName, IEnumerable> data, Func, Exception, bool> onError, bool resultRequired) + public IEnumerable> InsertMany(string tableName, CheckedEnumerable> data, ErrorCallback onError, bool resultRequired) { if (data == null) throw new ArgumentNullException("data"); var list = data.ToList(); diff --git a/Simple.Data.Ado/BulkInserter.cs b/Simple.Data.Ado/BulkInserter.cs index 6c6ac94a..df4f15c9 100644 --- a/Simple.Data.Ado/BulkInserter.cs +++ b/Simple.Data.Ado/BulkInserter.cs @@ -8,7 +8,7 @@ public class BulkInserter : IBulkInserter { - public IEnumerable> Insert(AdoAdapter adapter, string tableName, IEnumerable> data, IDbTransaction transaction, Func, Exception, bool> onError, bool resultRequired) + public IEnumerable> Insert(AdoAdapter adapter, string tableName, IEnumerable> data, IDbTransaction transaction, ErrorCallback onError, bool resultRequired) { var table = adapter.GetSchema().FindTable(tableName); var columns = table.Columns.Where(c => c.IsWriteable).ToList(); @@ -40,7 +40,7 @@ public IEnumerable> Insert(AdoAdapter adapter, strin return null; } - private static IEnumerable> InsertRowsAndReturn(AdoAdapter adapter, string identityFunction, BulkInserterHelper helper, string insertSql, Table table, Func, Exception, bool> onError) + private static IEnumerable> InsertRowsAndReturn(AdoAdapter adapter, string identityFunction, BulkInserterHelper helper, string insertSql, Table table, ErrorCallback onError) { var identityColumn = table.Columns.FirstOrDefault(col => col.IsIdentity); diff --git a/Simple.Data.Ado/BulkInserterHelper.cs b/Simple.Data.Ado/BulkInserterHelper.cs index d00874af..e7eef32e 100644 --- a/Simple.Data.Ado/BulkInserterHelper.cs +++ b/Simple.Data.Ado/BulkInserterHelper.cs @@ -10,12 +10,12 @@ namespace Simple.Data.Ado class BulkInserterHelper { protected readonly AdoAdapter Adapter; - protected readonly IEnumerable> Data; + protected readonly IEnumerable> Data; private readonly Table _table; private readonly List _columns; - private Action, IDbCommand> _parameterSetter; + private Action, IDbCommand> _parameterSetter; - public BulkInserterHelper(AdoAdapter adapter, IEnumerable> data, Table table, List columns) + public BulkInserterHelper(AdoAdapter adapter, IEnumerable> data, Table table, List columns) { Adapter = adapter; Data = data; @@ -23,7 +23,7 @@ public BulkInserterHelper(AdoAdapter adapter, IEnumerable, Exception, bool> onError) + public virtual void InsertRowsWithoutFetchBack(string insertSql, ErrorCallback onError) { var connection = Adapter.CreateConnection(); using (connection.MaybeDisposable()) @@ -40,7 +40,7 @@ public virtual void InsertRowsWithoutFetchBack(string insertSql, Func> InsertRowsWithSeparateStatements(string insertSql, string selectSql, Func, Exception, bool> onError) + public virtual IEnumerable> InsertRowsWithSeparateStatements(string insertSql, string selectSql, ErrorCallback onError) { var connection = Adapter.CreateConnection(); using (connection.MaybeDisposable()) @@ -56,7 +56,7 @@ public virtual IEnumerable> InsertRowsWithSeparateSt } } - public virtual IEnumerable> InsertRowsWithCompoundStatement(string insertSql, string selectSql, Func, Exception, bool> onError) + public virtual IEnumerable> InsertRowsWithCompoundStatement(string insertSql, string selectSql, ErrorCallback onError) { insertSql += "; " + selectSql; @@ -72,7 +72,7 @@ public virtual IEnumerable> InsertRowsWithCompoundSt } } - protected IDictionary InsertRowAndSelect(IDictionary row, IDbCommand command, Func, Exception, bool> onError) + protected IDictionary InsertRowAndSelect(IReadOnlyDictionary row, IDbCommand command, ErrorCallback onError) { if (_parameterSetter == null) _parameterSetter = BuildParameterSettingAction(row); _parameterSetter(row, command); @@ -89,7 +89,7 @@ protected IDictionary InsertRowAndSelect(IDictionary row, IDbCommand command, Func, Exception, bool> onError) + protected int InsertRow(IReadOnlyDictionary row, IDbCommand command, ErrorCallback onError) { if (_parameterSetter == null) _parameterSetter = BuildParameterSettingAction(row); _parameterSetter(row, command); @@ -105,7 +105,7 @@ protected int InsertRow(IDictionary row, IDbCommand command, Fun } } - protected IDictionary InsertRow(IDictionary row, IDbCommand insertCommand, IDbCommand selectCommand, Func, Exception, bool> onError) + protected IDictionary InsertRow(IReadOnlyDictionary row, IDbCommand insertCommand, IDbCommand selectCommand, ErrorCallback onError) { if (_parameterSetter == null) _parameterSetter = BuildParameterSettingAction(row); _parameterSetter(row, insertCommand); @@ -152,10 +152,10 @@ private static void TryPrepare(params IDbCommand[] commands) } } - private Action, IDbCommand> BuildParameterSettingAction(IDictionary sample) + private Action, IDbCommand> BuildParameterSettingAction(IReadOnlyDictionarysample) { var actions = - _columns.Select, IDbCommand>>((c, i) => (row, cmd) => cmd.SetParameterValue(i, null)).ToArray(); + _columns.Select, IDbCommand>>((c, i) => (row, cmd) => cmd.SetParameterValue(i, null)).ToArray(); var usedColumnNames = sample.Keys.Where(k => _columns.Any(c => String.Equals(c.ActualName, k, StringComparison.InvariantCultureIgnoreCase))).ToArray(); @@ -171,7 +171,7 @@ private Action, IDbCommand> BuildParameterSettingActi return actions.Aggregate((working, next) => working + next) ?? ((row,cmd) => { }); } - private Action, IDbCommand> BuildIndividualFunction(string key, int index) + private Action, IDbCommand> BuildIndividualFunction(string key, int index) { return (dict, command) => command.SetParameterValue(index, dict[key]); } diff --git a/Simple.Data.Ado/BulkInserterTransactionHelper.cs b/Simple.Data.Ado/BulkInserterTransactionHelper.cs index 3d2a25ad..cb835fd1 100644 --- a/Simple.Data.Ado/BulkInserterTransactionHelper.cs +++ b/Simple.Data.Ado/BulkInserterTransactionHelper.cs @@ -10,13 +10,13 @@ class BulkInserterTransactionHelper : BulkInserterHelper { private readonly IDbTransaction _transaction; - public BulkInserterTransactionHelper(AdoAdapter adapter, IEnumerable> data, Table table, List columns, IDbTransaction transaction) + public BulkInserterTransactionHelper(AdoAdapter adapter, IEnumerable> data, Table table, List columns, IDbTransaction transaction) : base(adapter, data, table, columns) { _transaction = transaction; } - public override IEnumerable> InsertRowsWithSeparateStatements(string insertSql, string selectSql, Func, Exception, bool> onError) + public override IEnumerable> InsertRowsWithSeparateStatements(string insertSql, string selectSql, ErrorCallback onError) { var insertCommand = new CommandHelper(Adapter).Create(_transaction.Connection, insertSql); var selectCommand = _transaction.Connection.CreateCommand(Adapter.AdoOptions); @@ -26,7 +26,7 @@ public override IEnumerable> InsertRowsWithSeparateS return Data.Select(row => InsertRow(row, insertCommand, selectCommand, onError)).ToList(); } - public override IEnumerable> InsertRowsWithCompoundStatement(string insertSql, string selectSql, Func, Exception, bool> onError) + public override IEnumerable> InsertRowsWithCompoundStatement(string insertSql, string selectSql, ErrorCallback onError) { insertSql += "; " + selectSql; var command = new CommandHelper(Adapter).Create(_transaction.Connection, insertSql); @@ -34,7 +34,7 @@ public override IEnumerable> InsertRowsWithCompoundS return Data.Select(row => InsertRowAndSelect(row, command, onError)).ToList(); } - public override void InsertRowsWithoutFetchBack(string insertSql, Func, Exception, bool> onError) + public override void InsertRowsWithoutFetchBack(string insertSql, ErrorCallback onError) { using (var insertCommand = new CommandHelper(Adapter).Create(_transaction.Connection, insertSql)) { diff --git a/Simple.Data.Ado/ExecutorFactory.cs b/Simple.Data.Ado/ExecutorFactory.cs new file mode 100644 index 00000000..7618abd1 --- /dev/null +++ b/Simple.Data.Ado/ExecutorFactory.cs @@ -0,0 +1,58 @@ +namespace Simple.Data.Ado +{ + using System; + using System.Collections.Generic; + using Operations; + using ExecuteFunc = System.Func; + using FuncDict = System.Collections.Generic.Dictionary>; + + internal class ExecutorFactory + { + private static readonly FuncDict Functions = CreateFunctionDictionary(); + + private static FuncDict CreateFunctionDictionary() + { + ICollection> dict = new FuncDict(); + dict.Add(CreateFunction(ExecuteQuery)); + dict.Add(CreateFunction(ExecuteInsert)); + return (FuncDict)dict; + } + + private static KeyValuePair CreateFunction(Func target) + { + ExecuteFunc func = (o, a, t) => target((T)o, a, t); + return new KeyValuePair(typeof(T), func); + } + + private static QueryResult ExecuteQuery(QueryOperation query, AdoAdapter adapter, AdoAdapterTransaction transaction) + { + var queryRunner = new AdoAdapterQueryRunner(adapter, transaction); + IEnumerable unhandled; + var data = queryRunner.RunQuery(query.Query, out unhandled); + return new QueryResult(data, unhandled); + } + + private static DataResult ExecuteInsert(InsertOperation operation, AdoAdapter adapter, AdoAdapterTransaction transaction) + { + var checkedEnumerable = CheckedEnumerable.Create(operation.Data); + if (checkedEnumerable.IsEmpty) return DataResult.Empty; + var inserter = transaction == null ? + new AdoAdapterInserter(adapter) + : + new AdoAdapterInserter(adapter, transaction.DbTransaction); + + if (checkedEnumerable.HasMoreThanOneValue) + { + return new DataResult( + inserter.InsertMany(operation.TableName, checkedEnumerable, operation.ErrorCallback, + operation.ResultRequired)); + } + return new DataResult(inserter.Insert(operation.TableName, checkedEnumerable.Single, operation.ResultRequired)); + } + + public bool TryGet(IOperation operation, out ExecuteFunc func) + { + return Functions.TryGetValue(operation.GetType(), out func); + } + } +} \ No newline at end of file diff --git a/Simple.Data.Ado/IBulkInserter.cs b/Simple.Data.Ado/IBulkInserter.cs index 37db09e9..2ed15f12 100644 --- a/Simple.Data.Ado/IBulkInserter.cs +++ b/Simple.Data.Ado/IBulkInserter.cs @@ -7,6 +7,6 @@ namespace Simple.Data.Ado public interface IBulkInserter { - IEnumerable> Insert(AdoAdapter adapter, string tableName, IEnumerable> data, IDbTransaction transaction, Func, Exception, bool> onError, bool resultRequired); + IEnumerable> Insert(AdoAdapter adapter, string tableName, IEnumerable> data, IDbTransaction transaction, ErrorCallback onError, bool resultRequired); } } \ No newline at end of file diff --git a/Simple.Data.Ado/Simple.Data.Ado.csproj b/Simple.Data.Ado/Simple.Data.Ado.csproj index 0c3e0eeb..cba4d5e2 100644 --- a/Simple.Data.Ado/Simple.Data.Ado.csproj +++ b/Simple.Data.Ado/Simple.Data.Ado.csproj @@ -93,6 +93,7 @@ + diff --git a/Simple.Data.BehaviourTest/TraceSettingsTest.cs b/Simple.Data.BehaviourTest/TraceSettingsTest.cs index 56533583..bbbbc8f2 100644 --- a/Simple.Data.BehaviourTest/TraceSettingsTest.cs +++ b/Simple.Data.BehaviourTest/TraceSettingsTest.cs @@ -10,6 +10,7 @@ namespace Simple.Data.IntegrationTest [TestFixture] public class TraceSettingsTest { +#pragma warning disable 618 [Test] public void TraceLevelShouldBePickedUpFromConfig() { @@ -23,5 +24,6 @@ public void TraceLevelShouldBeSettableFromCode() Assert.AreEqual(TraceLevel.Off, Database.TraceLevel); } +#pragma warning restore 618 } } diff --git a/Simple.Data.SqlServer/SqlBulkInserter.cs b/Simple.Data.SqlServer/SqlBulkInserter.cs index a7563636..a85bc2b5 100644 --- a/Simple.Data.SqlServer/SqlBulkInserter.cs +++ b/Simple.Data.SqlServer/SqlBulkInserter.cs @@ -13,7 +13,7 @@ namespace Simple.Data.SqlServer [Export(typeof(IBulkInserter))] public class SqlBulkInserter : IBulkInserter { - public IEnumerable> Insert(AdoAdapter adapter, string tableName, IEnumerable> data, IDbTransaction transaction, Func, Exception, bool> onError, bool resultRequired) + public IEnumerable> Insert(AdoAdapter adapter, string tableName, IEnumerable> data, IDbTransaction transaction, ErrorCallback onError, bool resultRequired) { if (resultRequired) { @@ -82,7 +82,7 @@ private SqlBulkCopyOptions BuildBulkCopyOptions(AdoAdapter adapter) return options; } - private DataTable CreateDataTable(AdoAdapter adapter, string tableName, ICollection keys, SqlBulkCopy bulkCopy) + private DataTable CreateDataTable(AdoAdapter adapter, string tableName, IEnumerable keys, SqlBulkCopy bulkCopy) { var table = adapter.GetSchema().FindTable(tableName); var dataTable = new DataTable(table.ActualName); diff --git a/Simple.Data.UnitTest/CheckedEnumerableTest.cs b/Simple.Data.UnitTest/CheckedEnumerableTest.cs new file mode 100644 index 00000000..63870257 --- /dev/null +++ b/Simple.Data.UnitTest/CheckedEnumerableTest.cs @@ -0,0 +1,71 @@ +namespace Simple.Data.UnitTest +{ + using System; + using System.Collections; + using System.Collections.Generic; + using System.Linq; + using NUnit.Framework; + + [TestFixture] + public class CheckedEnumerableTest + { + [Test] + public void DetectsEmpty() + { + var helper = new Helper(); + var target = new CheckedEnumerable(helper.GetEnumerable()); + Assert.IsTrue(target.IsEmpty); + Assert.IsTrue(target.IsEmpty); + Assert.DoesNotThrow(() => target.ToList()); + Assert.Throws(() => target.ToList()); + Assert.AreEqual(1, helper.UseCount); + } + + [Test] + public void DetectsOne() + { + var helper = new Helper(1); + var target = new CheckedEnumerable(helper.GetEnumerable()); + Assert.IsFalse(target.IsEmpty); + Assert.IsFalse(target.HasMoreThanOneValue); + Assert.DoesNotThrow(() => target.ToList()); + Assert.Throws(() => target.ToList()); + Assert.AreEqual(1, helper.UseCount); + Assert.AreEqual(1, target.Single); + } + + [Test] + public void DetectsMoreThanOne() + { + var helper = new Helper(1,2,3,4); + var target = new CheckedEnumerable(helper.GetEnumerable()); + Assert.IsFalse(target.IsEmpty); + Assert.IsTrue(target.HasMoreThanOneValue); + Assert.DoesNotThrow(() => target.ToList()); + Assert.Throws(() => target.ToList()); + Assert.AreEqual(1, helper.UseCount); + } + + class Helper + { + private readonly T[] _items; + + public Helper(params T[] items) + { + UseCount = 0; + _items = items; + } + + public int UseCount { get; set; } + + public IEnumerable GetEnumerable() + { + ++UseCount; + for (int i = 0; i < _items.Length; i++) + { + yield return _items[i]; + } + } + } + } +} \ No newline at end of file diff --git a/Simple.Data.UnitTest/Simple.Data.UnitTest.csproj b/Simple.Data.UnitTest/Simple.Data.UnitTest.csproj index 48228abe..465ae7e6 100644 --- a/Simple.Data.UnitTest/Simple.Data.UnitTest.csproj +++ b/Simple.Data.UnitTest/Simple.Data.UnitTest.csproj @@ -1,138 +1,139 @@ - - - - Debug - AnyCPU - - - 2.0 - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58} - Library - Properties - Simple.Data.UnitTest - Simple.Data.UnitTest - 512 - v4.5 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - - - - - 3.5 - - - - - - - - ..\packages\Trespasser.1.1\lib\net40\Trespasser.dll - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll - - - ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll - - - - - False - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} - Simple.Data.Ado - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - - - - - + + + + Debug + AnyCPU + + + 2.0 + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58} + Library + Properties + Simple.Data.UnitTest + Simple.Data.UnitTest + 512 + v4.5 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + 3.5 + + + + + + + + ..\packages\Trespasser.1.1\lib\net40\Trespasser.dll + + + ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll + + + ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll + + + ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} + Simple.Data.Ado + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + + + + + \ No newline at end of file diff --git a/Simple.Data/CheckedEnumerable.cs b/Simple.Data/CheckedEnumerable.cs new file mode 100644 index 00000000..23064335 --- /dev/null +++ b/Simple.Data/CheckedEnumerable.cs @@ -0,0 +1,157 @@ +using System; +using System.Collections.Generic; + +namespace Simple.Data +{ + using System.Collections; + using System.Linq; + using System.Threading; + + public static class CheckedEnumerable + { + public static CheckedEnumerable Create(IEnumerable source) + { + return new CheckedEnumerable(source); + } + } + + public class CheckedEnumerable : IEnumerable + { + private readonly object _sync = new object(); + private readonly IEnumerable _source; + private IEnumerator _sourceEnumerator; + private Enumerator _enumerator; + private T _first; + + public T Single + { + get + { + Check(); + if (_count != 1) throw new InvalidOperationException("Enumerable does not contain exactly one element."); + return _first; + } + } + + private T _second; + private int _count = -1; + private int _used; + + public CheckedEnumerable(IEnumerable source) + { + _source = source; + } + + public IEnumerator GetEnumerator() + { + if (Interlocked.CompareExchange(ref _used, 1, 0) == 1) + { + throw new InvalidOperationException("CheckedEnumerable may only be enumerated once."); + } + + Check(); + + return _count == 0 + ? Enumerable.Empty().GetEnumerator() + : new Enumerator(_count, _first, _second, _sourceEnumerator); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public bool IsEmpty + { + get + { + Check(); + return _count == 0; + } + } + public bool HasMoreThanOneValue + { + get + { + Check(); + return _count > 1; + } + } + + private void Check() + { + if (_sourceEnumerator == null) + { + lock (_sync) + { + if (_sourceEnumerator != null) return; + _sourceEnumerator = _source.GetEnumerator(); + if (!_sourceEnumerator.MoveNext()) + { + _count = 0; + return; + } + _first = _sourceEnumerator.Current; + if (_sourceEnumerator.MoveNext()) + { + _count = 2; + _second = _sourceEnumerator.Current; + return; + } + _count = 1; + } + } + } + + private class Enumerator : IEnumerator + { + private readonly IEnumerator _wrapped; + private int _check; + private readonly T _first; + private readonly T _second; + + public Enumerator(int check, T first, T second, IEnumerator wrapped) + { + _check = check; + _first = first; + _second = second; + _wrapped = wrapped; + } + + public void Dispose() + { + _wrapped.Dispose(); + } + + public bool MoveNext() + { + switch (_check--) + { + case 2: + Current = _first; + return true; + case 1: + Current = _second; + return true; + default: + bool moved = _wrapped.MoveNext(); + if (moved) Current = _wrapped.Current; + return moved; + } + } + + public void Reset() + { + _check = 0; + _wrapped.Reset(); + } + + public T Current { get; private set; } + + object IEnumerator.Current + { + get { return Current; } + } + } + } +} diff --git a/Simple.Data/DataResult.cs b/Simple.Data/DataResult.cs index 593fbca6..2e6ac59f 100644 --- a/Simple.Data/DataResult.cs +++ b/Simple.Data/DataResult.cs @@ -1,9 +1,12 @@ namespace Simple.Data { using System.Collections.Generic; + using System.Linq; public sealed class DataResult : OperationResult { + public static readonly DataResult Empty = new DataResult(Enumerable.Empty>()); + private readonly IEnumerable> _data; public IEnumerable> Data @@ -11,6 +14,11 @@ public IEnumerable> Data get { return _data; } } + public DataResult(IDictionary data) : this(EnumerableEx.Once(data)) + { + + } + public DataResult(IEnumerable> data) : base(0) { _data = data; diff --git a/Simple.Data/Simple.Data.csproj b/Simple.Data/Simple.Data.csproj index f04a7ed7..e62a59e2 100644 --- a/Simple.Data/Simple.Data.csproj +++ b/Simple.Data/Simple.Data.csproj @@ -95,6 +95,7 @@ + From 20efb8e7bb76dad9946f6c4e18d3609103ef6f3d Mon Sep 17 00:00:00 2001 From: Mark Rendle Date: Tue, 24 Sep 2013 16:24:27 +0100 Subject: [PATCH 04/15] UpdateEntity working again --- .../AdoAdapter.IAdapterWithTransactions.cs | 18 +++---- Simple.Data.Ado/AdoAdapter.cs | 14 +++--- Simple.Data.Ado/AdoAdapterUpserter.cs | 23 +++++---- Simple.Data.Ado/BulkUpdater.cs | 24 +++++---- Simple.Data.Ado/ExecutorFactory.cs | 49 +++++++++++++++++++ Simple.Data.Ado/IBulkUpdater.cs | 4 +- Simple.Data.Ado/UpdateHelper.cs | 2 +- Simple.Data/Adapter.cs | 2 +- Simple.Data/CommandResult.cs | 1 + .../Operations/UpdateEntityOperation.cs | 19 +++++++ 10 files changed, 116 insertions(+), 40 deletions(-) diff --git a/Simple.Data.Ado/AdoAdapter.IAdapterWithTransactions.cs b/Simple.Data.Ado/AdoAdapter.IAdapterWithTransactions.cs index 0c51c436..2d281f0f 100644 --- a/Simple.Data.Ado/AdoAdapter.IAdapterWithTransactions.cs +++ b/Simple.Data.Ado/AdoAdapter.IAdapterWithTransactions.cs @@ -32,7 +32,7 @@ public IAdapterTransaction BeginTransaction(string name, IsolationLevel isolatio return new AdoAdapterTransaction(transaction, name, _sharedConnection != null); } - public int UpdateMany(string tableName, IEnumerable> data, + public int UpdateMany(string tableName, IEnumerable> data, IAdapterTransaction transaction) { IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? @@ -40,7 +40,7 @@ public int UpdateMany(string tableName, IEnumerable> return bulkUpdater.Update(this, tableName, data.ToList(), ((AdoAdapterTransaction)transaction).DbTransaction); } - public int UpdateMany(string tableName, IEnumerable> data, + public int UpdateMany(string tableName, IEnumerable> data, IAdapterTransaction transaction, IList keyFields) { IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? @@ -48,15 +48,15 @@ public int UpdateMany(string tableName, IEnumerable> return bulkUpdater.Update(this, tableName, data.ToList(), ((AdoAdapterTransaction)transaction).DbTransaction); } - private int Update(string tableName, IDictionary data, IAdapterTransaction adapterTransaction) + private int Update(string tableName, IReadOnlyDictionary data, IAdapterTransaction adapterTransaction) { string[] keyFieldNames = GetKeyNames(tableName).ToArray(); if (keyFieldNames.Length == 0) throw new AdoAdapterException(string.Format("No primary key found for implicit update of table '{0}'.", tableName)); - var readOnlyDictionary = data.ToReadOnly(); + var readOnlyDictionary = data; return Update(tableName, data, GetCriteria(tableName, keyFieldNames, ref readOnlyDictionary), adapterTransaction); } - public int UpdateMany(string tableName, IList> dataList, + public int UpdateMany(string tableName, IList> dataList, IEnumerable criteriaFieldNames, IAdapterTransaction adapterTransaction) { IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? @@ -109,7 +109,7 @@ public IDictionary Insert(string tableName, IDictionary data, SimpleExpression criteria, + public int Update(string tableName, IReadOnlyDictionary data, SimpleExpression criteria, IAdapterTransaction transaction) { ICommandBuilder commandBuilder = new UpdateHelper(_schema).GetUpdateCommand(tableName, data, criteria); @@ -122,19 +122,19 @@ public int Delete(string tableName, SimpleExpression criteria, IAdapterTransacti return Execute(commandBuilder, transaction); } - private IDictionary Upsert(string tableName, IDictionary data, SimpleExpression criteria, bool resultRequired, IAdapterTransaction adapterTransaction) + private IDictionary Upsert(string tableName, IReadOnlyDictionary data, SimpleExpression criteria, bool resultRequired, IAdapterTransaction adapterTransaction) { var transaction = ((AdoAdapterTransaction) adapterTransaction).DbTransaction; return new AdoAdapterUpserter(this, transaction).Upsert(tableName, data, criteria, resultRequired); } - private IEnumerable> UpsertMany(string tableName, IList> list, IAdapterTransaction adapterTransaction, bool isResultRequired, Func, Exception, bool> errorCallback) + private IEnumerable> UpsertMany(string tableName, IList> list, IAdapterTransaction adapterTransaction, bool isResultRequired, Func, Exception, bool> errorCallback) { var transaction = ((AdoAdapterTransaction) adapterTransaction).DbTransaction; return new AdoAdapterUpserter(this, transaction).UpsertMany(tableName, list, isResultRequired, errorCallback); } - private IEnumerable> UpsertMany(string tableName, IList> list, IEnumerable keyFieldNames, IAdapterTransaction adapterTransaction, bool isResultRequired, Func, Exception, bool> errorCallback) + private IEnumerable> UpsertMany(string tableName, IList> list, IEnumerable keyFieldNames, IAdapterTransaction adapterTransaction, bool isResultRequired, Func, Exception, bool> errorCallback) { var transaction = ((AdoAdapterTransaction) adapterTransaction).DbTransaction; return new AdoAdapterUpserter(this, transaction).UpsertMany(tableName, list, keyFieldNames.ToArray(), isResultRequired, errorCallback); diff --git a/Simple.Data.Ado/AdoAdapter.cs b/Simple.Data.Ado/AdoAdapter.cs index 0bcd477e..c4c02fb4 100644 --- a/Simple.Data.Ado/AdoAdapter.cs +++ b/Simple.Data.Ado/AdoAdapter.cs @@ -231,7 +231,7 @@ private IDictionary Insert(string tableName, IDictionary> data, + private int UpdateMany(string tableName, IEnumerable> data, IEnumerable criteriaFieldNames) { IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? @@ -239,14 +239,14 @@ private int UpdateMany(string tableName, IEnumerable return bulkUpdater.Update(this, tableName, data.ToList(), criteriaFieldNames, null); } - private int UpdateMany(string tableName, IEnumerable> data) + private int UpdateMany(string tableName, IEnumerable> data) { IBulkUpdater bulkUpdater = ProviderHelper.GetCustomProvider(ConnectionProvider) ?? new BulkUpdater(); return bulkUpdater.Update(this, tableName, data.ToList(), null); } - private int Update(string tableName, IDictionary data, SimpleExpression criteria) + private int Update(string tableName, IReadOnlyDictionary data, SimpleExpression criteria) { ICommandBuilder commandBuilder = new UpdateHelper(_schema).GetUpdateCommand(tableName, data, criteria); return Execute(commandBuilder); @@ -284,7 +284,7 @@ public void ClearConnectionModifier() _connectionModifier = connection => connection; } - private int Execute(ICommandBuilder commandBuilder) + public int Execute(ICommandBuilder commandBuilder) { IDbConnection connection = CreateConnection(); using (connection.MaybeDisposable()) @@ -351,18 +351,18 @@ public DatabaseSchema GetSchema() return _schema ?? (_schema = DatabaseSchema.Get(_connectionProvider, _providerHelper)); } - private IDictionary Upsert(string tableName, IDictionary data, SimpleExpression criteria, bool resultRequired) + private IDictionary Upsert(string tableName, IReadOnlyDictionary data, SimpleExpression criteria, bool resultRequired) { return new AdoAdapterUpserter(this).Upsert(tableName, data, criteria, resultRequired); } - private IEnumerable> UpsertMany(string tableName, IList> list, bool isResultRequired, Func, Exception, bool> errorCallback) + private IEnumerable> UpsertMany(string tableName, IList> list, bool isResultRequired, Func, Exception, bool> errorCallback) { var upserter = new AdoAdapterUpserter(this); return upserter.UpsertMany(tableName, list, isResultRequired, errorCallback); } - private IEnumerable> UpsertMany(string tableName, IList> list, IEnumerable keyFieldNames, bool isResultRequired, Func, Exception, bool> errorCallback) + private IEnumerable> UpsertMany(string tableName, IList> list, IEnumerable keyFieldNames, bool isResultRequired, Func, Exception, bool> errorCallback) { return new AdoAdapterUpserter(this).UpsertMany(tableName, list, keyFieldNames.ToArray(), isResultRequired, errorCallback); } diff --git a/Simple.Data.Ado/AdoAdapterUpserter.cs b/Simple.Data.Ado/AdoAdapterUpserter.cs index 6e5eb61f..2ad51c81 100644 --- a/Simple.Data.Ado/AdoAdapterUpserter.cs +++ b/Simple.Data.Ado/AdoAdapterUpserter.cs @@ -29,7 +29,7 @@ public AdoAdapterUpserter(AdoAdapter adapter, IDbTransaction transaction) if (transaction != null) _connection = transaction.Connection; } - public IDictionary Upsert(string tableName, IDictionary data, SimpleExpression criteria, bool resultRequired) + public IDictionary Upsert(string tableName, IReadOnlyDictionary data, SimpleExpression criteria, bool resultRequired) { var connection = _connection ?? _adapter.CreateConnection(); using (connection.MaybeDisposable()) @@ -39,7 +39,7 @@ public IDictionary Upsert(string tableName, IDictionary Upsert(string tableName, IDictionary data, SimpleExpression criteria, bool resultRequired, + private IDictionary Upsert(string tableName, IReadOnlyDictionary data, SimpleExpression criteria, bool resultRequired, IDbConnection connection) { var finder = _transaction == null @@ -51,7 +51,7 @@ private IDictionary Upsert(string tableName, IDictionary().Select(o => o.GetName().Homogenize()); - var updateData = data.Where(kvp => keys.All(k => k != kvp.Key.Homogenize())).ToDictionary(); + var updateData = data.Where(kvp => keys.All(k => k != kvp.Key.Homogenize())).ToReadOnlyDictionary(); if (updateData.Count == 0) { return existing; @@ -75,14 +75,14 @@ private IDictionary Upsert(string tableName, IDictionary> UpsertMany(string tableName, IList> list, bool isResultRequired, Func, Exception, bool> errorCallback) + public IEnumerable> UpsertMany(string tableName, IList> list, bool isResultRequired, Func, Exception, bool> errorCallback) { foreach (var row in list) { IDictionary result; try { - var key = _adapter.GetKey(tableName, row.ToReadOnly()); + var key = _adapter.GetKey(tableName, row); if (key.Count == 0) { result = new AdoAdapterInserter(_adapter).Insert(tableName, row, isResultRequired); @@ -104,15 +104,16 @@ public IEnumerable> UpsertMany(string tableName, ILi } } - public IEnumerable> UpsertMany(string tableName, IList> list, IList keyFieldNames, bool isResultRequired, Func, Exception, bool> errorCallback) + public IEnumerable> UpsertMany(string tableName, IList> list, IList keyFieldNames, bool isResultRequired, Func, Exception, bool> errorCallback) { foreach (var row in list) { IDictionary result; try { - var criteria = GetCriteria(tableName, keyFieldNames, row); - result = Upsert(tableName, row, criteria, isResultRequired); + var copy = row; + var criteria = GetCriteria(tableName, keyFieldNames, ref copy); + result = Upsert(tableName, copy, criteria, isResultRequired); } catch (Exception ex) { @@ -125,9 +126,10 @@ public IEnumerable> UpsertMany(string tableName, ILi } private static SimpleExpression GetCriteria(string tableName, IEnumerable criteriaFieldNames, - IDictionary record) + ref IReadOnlyDictionary record) { var criteria = new Dictionary(); + var writeable = record.ToDictionary(); foreach (var criteriaFieldName in criteriaFieldNames) { @@ -139,8 +141,9 @@ private static SimpleExpression GetCriteria(string tableName, IEnumerable> data, IDbTransaction transaction) + public int Update(AdoAdapter adapter, string tableName, IEnumerable> data, IDbTransaction transaction) { return Update(adapter, tableName, data, adapter.GetKeyNames(tableName).ToList(), transaction); } - public int Update(AdoAdapter adapter, string tableName, IList> data, IEnumerable criteriaFieldNames, IDbTransaction transaction) + public int Update(AdoAdapter adapter, string tableName, IEnumerable> data, IEnumerable criteriaFieldNames, IDbTransaction transaction) { + if (data == null) return 0; + + var list = data.ToList(); + if (list.Count == 0) return 0; + int count = 0; - if (data == null || !data.Any()) - return count; var criteriaFieldNameList = criteriaFieldNames.ToList(); if (criteriaFieldNameList.Count == 0) throw new NotSupportedException("Adapter does not support key-based update for this object."); - if (!AllRowsHaveSameKeys(data)) throw new SimpleDataException("Records have different structures. Bulk updates are only valid on consistent records."); + if (!AllRowsHaveSameKeys(list)) throw new SimpleDataException("Records have different structures. Bulk updates are only valid on consistent records."); var table = adapter.GetSchema().FindTable(tableName); - var exampleRow = new Dictionary(data.First(), HomogenizedEqualityComparer.DefaultInstance); + var first = list.First().ToDictionary(kvp => kvp.Key, kvp => kvp.Value, HomogenizedEqualityComparer.DefaultInstance); + var exampleRow = new Dictionary(first, HomogenizedEqualityComparer.DefaultInstance); var commandBuilder = new UpdateHelper(adapter.GetSchema()).GetUpdateCommand(tableName, exampleRow, ExpressionHelper.CriteriaDictionaryToExpression( @@ -42,9 +46,9 @@ public int Update(AdoAdapter adapter, string tableName, IList CreatePropertyToParameterMap(IEnumerable> data, Table table, IDbCommand command) + private static Dictionary CreatePropertyToParameterMap(IEnumerable> data, Table table, IDbCommand command) { return data.First().Select(kvp => new { @@ -87,7 +91,7 @@ private static IDbDataParameter GetDbDataParameter(Table table, IDbCommand comma } } - private static bool AllRowsHaveSameKeys(IList> data) + private static bool AllRowsHaveSameKeys(IEnumerable> data) { var exemplar = new HashSet(data.First().Keys); diff --git a/Simple.Data.Ado/ExecutorFactory.cs b/Simple.Data.Ado/ExecutorFactory.cs index 7618abd1..b48fe4b7 100644 --- a/Simple.Data.Ado/ExecutorFactory.cs +++ b/Simple.Data.Ado/ExecutorFactory.cs @@ -2,6 +2,8 @@ { using System; using System.Collections.Generic; + using System.Data; + using System.Linq; using Operations; using ExecuteFunc = System.Func; using FuncDict = System.Collections.Generic.Dictionary>; @@ -15,6 +17,7 @@ private static FuncDict CreateFunctionDictionary() ICollection> dict = new FuncDict(); dict.Add(CreateFunction(ExecuteQuery)); dict.Add(CreateFunction(ExecuteInsert)); + dict.Add(CreateFunction(ExecuteUpdateEntity)); return (FuncDict)dict; } @@ -50,9 +53,55 @@ private static DataResult ExecuteInsert(InsertOperation operation, AdoAdapter ad return new DataResult(inserter.Insert(operation.TableName, checkedEnumerable.Single, operation.ResultRequired)); } + private static CommandResult ExecuteUpdateEntity(UpdateEntityOperation operation, AdoAdapter adapter, + AdoAdapterTransaction transaction) + { + var checkedEnumerable = CheckedEnumerable.Create(operation.Data); + if (checkedEnumerable.IsEmpty) return CommandResult.Empty; + + if (checkedEnumerable.HasMoreThanOneValue) + { + return BulkUpdateEntity(operation, adapter, transaction, checkedEnumerable); + } + + string[] keyFieldNames = adapter.GetKeyNames(operation.TableName).ToArray(); + if (keyFieldNames.Length == 0) throw new AdoAdapterException(string.Format("No primary key found for implicit update of table '{0}'.", operation.TableName)); + var dict = checkedEnumerable.Single; + + return new CommandResult(Update(adapter, operation.TableName, checkedEnumerable.Single, Adapter.GetCriteria(operation.TableName, keyFieldNames, ref dict), GetDbTransaction(transaction))); + } + + private static int Update(AdoAdapter adapter, string tableName, IReadOnlyDictionary data, SimpleExpression criteria, IDbTransaction transaction) + { + ICommandBuilder commandBuilder = new UpdateHelper(adapter.GetSchema()).GetUpdateCommand(tableName, data, criteria); + return transaction == null ? adapter.Execute(commandBuilder) : adapter.Execute(commandBuilder, transaction); + } + + private static CommandResult BulkUpdateEntity(UpdateEntityOperation operation, AdoAdapter adapter, + AdoAdapterTransaction transaction, IEnumerable> checkedEnumerable) + { + IBulkUpdater bulkUpdater = adapter.ProviderHelper.GetCustomProvider(adapter.ConnectionProvider) ?? + new BulkUpdater(); + if (operation.CriteriaFieldNames != null) + { + return + new CommandResult(bulkUpdater.Update(adapter, operation.TableName, checkedEnumerable, + operation.CriteriaFieldNames, + GetDbTransaction(transaction))); + } + return + new CommandResult(bulkUpdater.Update(adapter, operation.TableName, checkedEnumerable, + GetDbTransaction(transaction))); + } + public bool TryGet(IOperation operation, out ExecuteFunc func) { return Functions.TryGetValue(operation.GetType(), out func); } + + private static IDbTransaction GetDbTransaction(AdoAdapterTransaction transaction) + { + return transaction != null ? transaction.DbTransaction : null; + } } } \ No newline at end of file diff --git a/Simple.Data.Ado/IBulkUpdater.cs b/Simple.Data.Ado/IBulkUpdater.cs index 5fc52376..cb101f73 100644 --- a/Simple.Data.Ado/IBulkUpdater.cs +++ b/Simple.Data.Ado/IBulkUpdater.cs @@ -5,7 +5,7 @@ namespace Simple.Data.Ado public interface IBulkUpdater { - int Update(AdoAdapter adapter, string tableName, IList> data, IDbTransaction transaction); - int Update(AdoAdapter adapter, string tableName, IList> toList, IEnumerable criteriaFieldNames, IDbTransaction dbTransaction); + int Update(AdoAdapter adapter, string tableName, IEnumerable> data, IDbTransaction transaction); + int Update(AdoAdapter adapter, string tableName, IEnumerable> toList, IEnumerable criteriaFieldNames, IDbTransaction dbTransaction); } } \ No newline at end of file diff --git a/Simple.Data.Ado/UpdateHelper.cs b/Simple.Data.Ado/UpdateHelper.cs index 836afe9b..ca2f061c 100644 --- a/Simple.Data.Ado/UpdateHelper.cs +++ b/Simple.Data.Ado/UpdateHelper.cs @@ -22,7 +22,7 @@ public UpdateHelper(DatabaseSchema schema) _expressionFormatter = new ExpressionFormatter(_commandBuilder, _schema); } - public ICommandBuilder GetUpdateCommand(string tableName, IDictionary data, SimpleExpression criteria) + public ICommandBuilder GetUpdateCommand(string tableName, IReadOnlyDictionary data, SimpleExpression criteria) { var table = _schema.FindTable(tableName); var updateClause = GetUpdateClause(table, data); diff --git a/Simple.Data/Adapter.cs b/Simple.Data/Adapter.cs index 1ead220c..7bb921a3 100644 --- a/Simple.Data/Adapter.cs +++ b/Simple.Data/Adapter.cs @@ -96,7 +96,7 @@ protected virtual void OnSetup() /// The names of fields to be used for the criteria. /// The name/value pairs to be used as criteria. /// A criteria object. - protected static SimpleExpression GetCriteria(string tableName, IEnumerable criteriaFieldNames, + public static SimpleExpression GetCriteria(string tableName, IEnumerable criteriaFieldNames, ref IReadOnlyDictionary record) { var criteria = new Dictionary(); diff --git a/Simple.Data/CommandResult.cs b/Simple.Data/CommandResult.cs index da892bf8..3ee5e45b 100644 --- a/Simple.Data/CommandResult.cs +++ b/Simple.Data/CommandResult.cs @@ -2,6 +2,7 @@ { public sealed class CommandResult : OperationResult { + public static readonly CommandResult Empty = new CommandResult(-1); private readonly int _rowsAffected; public int RowsAffected diff --git a/Simple.Data/Operations/UpdateEntityOperation.cs b/Simple.Data/Operations/UpdateEntityOperation.cs index 7c4f23d4..bae1505c 100644 --- a/Simple.Data/Operations/UpdateEntityOperation.cs +++ b/Simple.Data/Operations/UpdateEntityOperation.cs @@ -1,12 +1,14 @@ namespace Simple.Data.Operations { using System.Collections.Generic; + using System.Linq; public class UpdateEntityOperation : IOperation { private readonly string _tableName; private readonly IEnumerable> _data; private readonly IEnumerable> _originals; + private readonly string[] _criteriaFieldNames; public UpdateEntityOperation(string tableName, IReadOnlyDictionary data, IReadOnlyDictionary original = null) : this(tableName, EnumerableEx.Once(data), original == null ? null : EnumerableEx.Once(original)) @@ -20,6 +22,18 @@ public UpdateEntityOperation(string tableName, IEnumerable data, IEnumerable criteriaFieldNames) + : this(tableName, EnumerableEx.Once(data), criteriaFieldNames) + { + } + + public UpdateEntityOperation(string tableName, IEnumerable> data, IEnumerable criteriaFieldNames) + { + _tableName = tableName; + _data = data; + _criteriaFieldNames = criteriaFieldNames.ToArray(); + } public string TableName { @@ -35,5 +49,10 @@ public IEnumerable> Originals { get { return _originals; } } + + public string[] CriteriaFieldNames + { + get { return _criteriaFieldNames; } + } } } \ No newline at end of file From e48e9dee0dc66bbd4a6f9805fa1bdf71a4792b69 Mon Sep 17 00:00:00 2001 From: Mark Rendle Date: Fri, 27 Sep 2013 00:14:15 +0100 Subject: [PATCH 05/15] FindBy tests all passing again --- Simple.Data.Ado/AdoAdapter.cs | 1 + Simple.Data.Ado/AdoAdapterTransaction.cs | 8 ++ Simple.Data.Ado/DeleteExecutor.cs | 14 ++++ Simple.Data.Ado/ExecutorFactory.cs | 79 +------------------ Simple.Data.Ado/InsertExecutor.cs | 25 ++++++ Simple.Data.Ado/QueryExecutor.cs | 16 ++++ Simple.Data.Ado/Simple.Data.Ado.csproj | 4 + Simple.Data.Ado/UpdateEntityExecutor.cs | 50 ++++++++++++ Simple.Data.BehaviourTest/FindTest.cs | 2 +- .../NaturalNamingTest.cs | 2 +- .../Query/FunctionTest.cs | 2 +- Simple.Data/Commands/FindByCommand.cs | 3 +- Simple.Data/Commands/FindCommand.cs | 2 +- Simple.Data/Commands/InsertCommand.cs | 19 ++++- 14 files changed, 144 insertions(+), 83 deletions(-) create mode 100644 Simple.Data.Ado/DeleteExecutor.cs create mode 100644 Simple.Data.Ado/InsertExecutor.cs create mode 100644 Simple.Data.Ado/QueryExecutor.cs create mode 100644 Simple.Data.Ado/UpdateEntityExecutor.cs diff --git a/Simple.Data.Ado/AdoAdapter.cs b/Simple.Data.Ado/AdoAdapter.cs index c4c02fb4..1f2442ad 100644 --- a/Simple.Data.Ado/AdoAdapter.cs +++ b/Simple.Data.Ado/AdoAdapter.cs @@ -311,6 +311,7 @@ internal int Execute(ICommandBuilder commandBuilder, IDbConnection connection) internal int Execute(ICommandBuilder commandBuilder, IAdapterTransaction transaction) { + if (transaction == null) return Execute(commandBuilder); IDbTransaction dbTransaction = ((AdoAdapterTransaction) transaction).DbTransaction; return Execute(commandBuilder, dbTransaction); } diff --git a/Simple.Data.Ado/AdoAdapterTransaction.cs b/Simple.Data.Ado/AdoAdapterTransaction.cs index 2177f8a3..ac0ac54e 100644 --- a/Simple.Data.Ado/AdoAdapterTransaction.cs +++ b/Simple.Data.Ado/AdoAdapterTransaction.cs @@ -53,4 +53,12 @@ public string Name get { return _name; } } } + + static class AdoAdapterTransactionEx + { + public static IDbTransaction TransactionOrDefault(this AdoAdapterTransaction transaction) + { + return ReferenceEquals(transaction, null) ? null : transaction.DbTransaction; + } + } } diff --git a/Simple.Data.Ado/DeleteExecutor.cs b/Simple.Data.Ado/DeleteExecutor.cs new file mode 100644 index 00000000..79cb3e96 --- /dev/null +++ b/Simple.Data.Ado/DeleteExecutor.cs @@ -0,0 +1,14 @@ +namespace Simple.Data.Ado +{ + using Operations; + + internal class DeleteExecutor + { + public static CommandResult Execute(DeleteOperation operation, AdoAdapter adapter, + AdoAdapterTransaction transaction) + { + ICommandBuilder commandBuilder = new DeleteHelper(adapter.GetSchema()).GetDeleteCommand(operation.TableName, operation.Criteria); + return new CommandResult(adapter.Execute(commandBuilder, transaction)); + } + } +} \ No newline at end of file diff --git a/Simple.Data.Ado/ExecutorFactory.cs b/Simple.Data.Ado/ExecutorFactory.cs index b48fe4b7..f7352c9a 100644 --- a/Simple.Data.Ado/ExecutorFactory.cs +++ b/Simple.Data.Ado/ExecutorFactory.cs @@ -15,9 +15,10 @@ internal class ExecutorFactory private static FuncDict CreateFunctionDictionary() { ICollection> dict = new FuncDict(); - dict.Add(CreateFunction(ExecuteQuery)); - dict.Add(CreateFunction(ExecuteInsert)); - dict.Add(CreateFunction(ExecuteUpdateEntity)); + dict.Add(CreateFunction(QueryExecutor.ExecuteQuery)); + dict.Add(CreateFunction(InsertExecutor.ExecuteInsert)); + dict.Add(CreateFunction(UpdateEntityExecutor.ExecuteUpdateEntity)); + dict.Add(CreateFunction(DeleteExecutor.Execute)); return (FuncDict)dict; } @@ -27,81 +28,9 @@ private static KeyValuePair CreateFunction(Func(typeof(T), func); } - private static QueryResult ExecuteQuery(QueryOperation query, AdoAdapter adapter, AdoAdapterTransaction transaction) - { - var queryRunner = new AdoAdapterQueryRunner(adapter, transaction); - IEnumerable unhandled; - var data = queryRunner.RunQuery(query.Query, out unhandled); - return new QueryResult(data, unhandled); - } - - private static DataResult ExecuteInsert(InsertOperation operation, AdoAdapter adapter, AdoAdapterTransaction transaction) - { - var checkedEnumerable = CheckedEnumerable.Create(operation.Data); - if (checkedEnumerable.IsEmpty) return DataResult.Empty; - var inserter = transaction == null ? - new AdoAdapterInserter(adapter) - : - new AdoAdapterInserter(adapter, transaction.DbTransaction); - - if (checkedEnumerable.HasMoreThanOneValue) - { - return new DataResult( - inserter.InsertMany(operation.TableName, checkedEnumerable, operation.ErrorCallback, - operation.ResultRequired)); - } - return new DataResult(inserter.Insert(operation.TableName, checkedEnumerable.Single, operation.ResultRequired)); - } - - private static CommandResult ExecuteUpdateEntity(UpdateEntityOperation operation, AdoAdapter adapter, - AdoAdapterTransaction transaction) - { - var checkedEnumerable = CheckedEnumerable.Create(operation.Data); - if (checkedEnumerable.IsEmpty) return CommandResult.Empty; - - if (checkedEnumerable.HasMoreThanOneValue) - { - return BulkUpdateEntity(operation, adapter, transaction, checkedEnumerable); - } - - string[] keyFieldNames = adapter.GetKeyNames(operation.TableName).ToArray(); - if (keyFieldNames.Length == 0) throw new AdoAdapterException(string.Format("No primary key found for implicit update of table '{0}'.", operation.TableName)); - var dict = checkedEnumerable.Single; - - return new CommandResult(Update(adapter, operation.TableName, checkedEnumerable.Single, Adapter.GetCriteria(operation.TableName, keyFieldNames, ref dict), GetDbTransaction(transaction))); - } - - private static int Update(AdoAdapter adapter, string tableName, IReadOnlyDictionary data, SimpleExpression criteria, IDbTransaction transaction) - { - ICommandBuilder commandBuilder = new UpdateHelper(adapter.GetSchema()).GetUpdateCommand(tableName, data, criteria); - return transaction == null ? adapter.Execute(commandBuilder) : adapter.Execute(commandBuilder, transaction); - } - - private static CommandResult BulkUpdateEntity(UpdateEntityOperation operation, AdoAdapter adapter, - AdoAdapterTransaction transaction, IEnumerable> checkedEnumerable) - { - IBulkUpdater bulkUpdater = adapter.ProviderHelper.GetCustomProvider(adapter.ConnectionProvider) ?? - new BulkUpdater(); - if (operation.CriteriaFieldNames != null) - { - return - new CommandResult(bulkUpdater.Update(adapter, operation.TableName, checkedEnumerable, - operation.CriteriaFieldNames, - GetDbTransaction(transaction))); - } - return - new CommandResult(bulkUpdater.Update(adapter, operation.TableName, checkedEnumerable, - GetDbTransaction(transaction))); - } - public bool TryGet(IOperation operation, out ExecuteFunc func) { return Functions.TryGetValue(operation.GetType(), out func); } - - private static IDbTransaction GetDbTransaction(AdoAdapterTransaction transaction) - { - return transaction != null ? transaction.DbTransaction : null; - } } } \ No newline at end of file diff --git a/Simple.Data.Ado/InsertExecutor.cs b/Simple.Data.Ado/InsertExecutor.cs new file mode 100644 index 00000000..58c02fab --- /dev/null +++ b/Simple.Data.Ado/InsertExecutor.cs @@ -0,0 +1,25 @@ +namespace Simple.Data.Ado +{ + using Operations; + + internal class InsertExecutor + { + public static DataResult ExecuteInsert(InsertOperation operation, AdoAdapter adapter, AdoAdapterTransaction transaction) + { + var checkedEnumerable = CheckedEnumerable.Create(operation.Data); + if (checkedEnumerable.IsEmpty) return DataResult.Empty; + var inserter = transaction == null ? + new AdoAdapterInserter(adapter) + : + new AdoAdapterInserter(adapter, transaction.DbTransaction); + + if (checkedEnumerable.HasMoreThanOneValue) + { + return new DataResult( + inserter.InsertMany(operation.TableName, checkedEnumerable, operation.ErrorCallback, + operation.ResultRequired)); + } + return new DataResult(inserter.Insert(operation.TableName, checkedEnumerable.Single, operation.ResultRequired)); + } + } +} \ No newline at end of file diff --git a/Simple.Data.Ado/QueryExecutor.cs b/Simple.Data.Ado/QueryExecutor.cs new file mode 100644 index 00000000..05e61aa3 --- /dev/null +++ b/Simple.Data.Ado/QueryExecutor.cs @@ -0,0 +1,16 @@ +namespace Simple.Data.Ado +{ + using System.Collections.Generic; + using Operations; + + internal class QueryExecutor + { + public static QueryResult ExecuteQuery(QueryOperation query, AdoAdapter adapter, AdoAdapterTransaction transaction) + { + var queryRunner = new AdoAdapterQueryRunner(adapter, transaction); + IEnumerable unhandled; + var data = queryRunner.RunQuery(query.Query, out unhandled); + return new QueryResult(data, unhandled); + } + } +} \ No newline at end of file diff --git a/Simple.Data.Ado/Simple.Data.Ado.csproj b/Simple.Data.Ado/Simple.Data.Ado.csproj index cba4d5e2..746f4e7f 100644 --- a/Simple.Data.Ado/Simple.Data.Ado.csproj +++ b/Simple.Data.Ado/Simple.Data.Ado.csproj @@ -89,6 +89,7 @@ + @@ -110,6 +111,7 @@ + @@ -131,6 +133,7 @@ + @@ -153,6 +156,7 @@ + diff --git a/Simple.Data.Ado/UpdateEntityExecutor.cs b/Simple.Data.Ado/UpdateEntityExecutor.cs new file mode 100644 index 00000000..166ae710 --- /dev/null +++ b/Simple.Data.Ado/UpdateEntityExecutor.cs @@ -0,0 +1,50 @@ +namespace Simple.Data.Ado +{ + using System.Collections.Generic; + using System.Data; + using System.Linq; + using Operations; + + internal class UpdateEntityExecutor + { + public static CommandResult ExecuteUpdateEntity(UpdateEntityOperation operation, AdoAdapter adapter, + AdoAdapterTransaction transaction) + { + var checkedEnumerable = CheckedEnumerable.Create(operation.Data); + if (checkedEnumerable.IsEmpty) return CommandResult.Empty; + + if (checkedEnumerable.HasMoreThanOneValue) + { + return BulkUpdateEntity(operation, adapter, transaction, checkedEnumerable); + } + + string[] keyFieldNames = adapter.GetKeyNames(operation.TableName).ToArray(); + if (keyFieldNames.Length == 0) throw new AdoAdapterException(string.Format("No primary key found for implicit update of table '{0}'.", operation.TableName)); + var dict = checkedEnumerable.Single; + + return new CommandResult(Update(adapter, operation.TableName, checkedEnumerable.Single, Adapter.GetCriteria(operation.TableName, keyFieldNames, ref dict), transaction.TransactionOrDefault())); + } + + private static int Update(AdoAdapter adapter, string tableName, IReadOnlyDictionary data, SimpleExpression criteria, IDbTransaction transaction) + { + ICommandBuilder commandBuilder = new UpdateHelper(adapter.GetSchema()).GetUpdateCommand(tableName, data, criteria); + return transaction == null ? adapter.Execute(commandBuilder) : adapter.Execute(commandBuilder, transaction); + } + + private static CommandResult BulkUpdateEntity(UpdateEntityOperation operation, AdoAdapter adapter, + AdoAdapterTransaction transaction, IEnumerable> checkedEnumerable) + { + IBulkUpdater bulkUpdater = adapter.ProviderHelper.GetCustomProvider(adapter.ConnectionProvider) ?? + new BulkUpdater(); + if (operation.CriteriaFieldNames != null) + { + return + new CommandResult(bulkUpdater.Update(adapter, operation.TableName, checkedEnumerable, + operation.CriteriaFieldNames, transaction.TransactionOrDefault())); + } + return + new CommandResult(bulkUpdater.Update(adapter, operation.TableName, checkedEnumerable, + transaction.TransactionOrDefault())); + } + } +} \ No newline at end of file diff --git a/Simple.Data.BehaviourTest/FindTest.cs b/Simple.Data.BehaviourTest/FindTest.cs index 32860526..03106f81 100644 --- a/Simple.Data.BehaviourTest/FindTest.cs +++ b/Simple.Data.BehaviourTest/FindTest.cs @@ -22,7 +22,7 @@ protected override void SetSchema(MockSchemaProvider schemaProvider) // ReSharper restore CoVariantArrayConversion } - private const string UsersColumns = "[dbo].[Users].[Id], [dbo].[Users].[Name], [dbo].[Users].[Password], [dbo].[Users].[Age]"; + private const string UsersColumns = "[dbo].[Users].[Id],[dbo].[Users].[Name],[dbo].[Users].[Password],[dbo].[Users].[Age]"; [Test] public void TestFindEqualWithInt32() { diff --git a/Simple.Data.BehaviourTest/NaturalNamingTest.cs b/Simple.Data.BehaviourTest/NaturalNamingTest.cs index 8b21e242..3a6d4484 100644 --- a/Simple.Data.BehaviourTest/NaturalNamingTest.cs +++ b/Simple.Data.BehaviourTest/NaturalNamingTest.cs @@ -25,7 +25,7 @@ protected override void SetSchema(MockSchemaProvider schemaProvider) public void DotNetNamingIsCorrectlyResolvedInFind() { _db.Customers.Find(_db.Customers.CustomerName == "Arthur"); - GeneratedSqlIs("select [dbo].[Customers].[CustomerId], [dbo].[Customers].[Customer_Name] from [dbo].[customers] where [dbo].[customers].[customer_name] = @p1"); + GeneratedSqlIs("select [dbo].[Customers].[CustomerId],[dbo].[Customers].[Customer_Name] from [dbo].[customers] where [dbo].[customers].[customer_name] = @p1"); Parameter(0).Is("Arthur"); } diff --git a/Simple.Data.BehaviourTest/Query/FunctionTest.cs b/Simple.Data.BehaviourTest/Query/FunctionTest.cs index 3eb406b7..a6ca19a5 100644 --- a/Simple.Data.BehaviourTest/Query/FunctionTest.cs +++ b/Simple.Data.BehaviourTest/Query/FunctionTest.cs @@ -19,7 +19,7 @@ protected override void SetSchema(MockSchemaProvider schemaProvider) new[] { "dbo", "Users", "Password" }); } - private const string usersColumns = "[dbo].[Users].[Name], [dbo].[Users].[Password]"; + private const string usersColumns = "[dbo].[Users].[Name],[dbo].[Users].[Password]"; [Test] public void SubstringIsEnteredCorrectlyInFindAll() diff --git a/Simple.Data/Commands/FindByCommand.cs b/Simple.Data/Commands/FindByCommand.cs index f80b373f..78ed614e 100644 --- a/Simple.Data/Commands/FindByCommand.cs +++ b/Simple.Data/Commands/FindByCommand.cs @@ -50,7 +50,8 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), CreateCriteriaDictionary(binder, args)); - return dataStrategy.Run.Execute(new QueryOperation(dataStrategy, table.GetQualifiedName(), criteriaExpression)); + var result = (QueryResult)dataStrategy.Run.Execute(new QueryOperation(dataStrategy, table.GetQualifiedName(), criteriaExpression)); + return result.Data.FirstOrDefault(); } public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args) diff --git a/Simple.Data/Commands/FindCommand.cs b/Simple.Data/Commands/FindCommand.cs index e09cf746..49b99242 100644 --- a/Simple.Data/Commands/FindCommand.cs +++ b/Simple.Data/Commands/FindCommand.cs @@ -33,7 +33,7 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe { if (args.Length == 1 && args[0] is SimpleExpression) { - var result = (DataResult)dataStrategy.Run.Execute(new QueryOperation(dataStrategy, table.GetQualifiedName(), (SimpleExpression)args[0])); + var result = (QueryResult)dataStrategy.Run.Execute(new QueryOperation(dataStrategy, table.GetQualifiedName(), (SimpleExpression)args[0])); var data = result.Data.FirstOrDefault(); return data != null ? new SimpleRecord(data, table.GetQualifiedName(), dataStrategy) : null; } diff --git a/Simple.Data/Commands/InsertCommand.cs b/Simple.Data/Commands/InsertCommand.cs index 56ff6c58..b9552f68 100644 --- a/Simple.Data/Commands/InsertCommand.cs +++ b/Simple.Data/Commands/InsertCommand.cs @@ -58,11 +58,24 @@ private static DataResult InsertEntity(object entity, DataStrategy dataStrategy, var operation = new InsertOperation(tableName, readOnlyDictionary, resultRequired); return (DataResult)dataStrategy.Run.Execute(operation); } + + var dictionary = entity as IDictionary; + if (dictionary != null) + { + var operation = new InsertOperation(tableName, dictionary, resultRequired); + return (DataResult)dataStrategy.Run.Execute(operation); + } - var list = entity as IEnumerable>; - if (list != null) + var readonlyDictionaryList = entity as IEnumerable>; + if (readonlyDictionaryList != null) + { + return (DataResult)dataStrategy.Run.Execute(new InsertOperation(tableName, readonlyDictionaryList, resultRequired, onError)); + } + + var dictionaryList = entity as IEnumerable>; + if (dictionaryList != null) { - return (DataResult)dataStrategy.Run.Execute(new InsertOperation(tableName, list, resultRequired, onError)); + return (DataResult)dataStrategy.Run.Execute(new InsertOperation(tableName, dictionaryList, resultRequired, onError)); } var entityList = entity as IEnumerable; From 12dc65936026469965cda5c0922c1fa5b46fc321 Mon Sep 17 00:00:00 2001 From: Mark Rendle Date: Mon, 30 Sep 2013 17:07:36 +0100 Subject: [PATCH 06/15] All but SQL Upsert tests are passing, yay --- .../AdoAdapter.IAdapterWithFunctions.cs | 9 +- .../AdoAdapter.IAdapterWithRelation.cs | 5 +- Simple.Data.Ado/AdoAdapter.cs | 8 +- Simple.Data.Ado/AdoAdapterRelatedFinder.cs | 15 +- Simple.Data.Ado/ExecutorFactory.cs | 9 + Simple.Data.Ado/GetExecutor.cs | 15 + Simple.Data.Ado/QueryBuilderBase.cs | 3 +- Simple.Data.Ado/Simple.Data.Ado.csproj | 2 + Simple.Data.Ado/UpdateByCriteriaExecutor.cs | 13 + Simple.Data.Ado/UpdateEntityExecutor.cs | 46 +- Simple.Data.BehaviourTest/Query/QueryTest.cs | 6 - .../SchemaQualifiedTableTest.cs | 4 +- Simple.Data.BehaviourTest/TransactionTest.cs | 2 +- Simple.Data.Migrations.Tests/Class1.cs | 9 + .../Properties/AssemblyInfo.cs | 36 + .../Simple.Data.Migrations.Tests.csproj | 59 + Simple.Data.Migrations.Tests/packages.config | 4 + Simple.Data.Migrations/Class1.cs | 92 + .../Properties/AssemblyInfo.cs | 36 + .../Simple.Data.Migrations.csproj | 53 + Simple.Data.UnitTest/BinderHelperTest.cs | 4 +- Simple.Data.sln | 659 +- Simple.Data/Adapter.cs | 2 +- Simple.Data/BinderHelper.cs | 20 +- Simple.Data/Commands/DeleteByCommand.cs | 3 +- .../Commands/ExecuteFunctionCommand.cs | 8 +- Simple.Data/Commands/FindByCommand.cs | 2 +- Simple.Data/Commands/ResultHelper.cs | 25 +- Simple.Data/Commands/UpdateByCommand.cs | 12 +- Simple.Data/Commands/UpdateCommand.cs | 3 +- Simple.Data/DataStrategy.cs | 2 +- .../Extensions/EnumerableExtensions.cs | 2 +- Simple.Data/Extensions/ResultSetExtensions.cs | 3 +- Simple.Data/IAdapterWithRelation.cs | 3 +- .../InMemoryAdapterIAdapterWithRelation.cs | 2 +- Simple.Data/Operations/GetOperation.cs | 6 +- Simple.Data/SimpleRecord.Dictionary2.cs | 32 +- Simple.Data/SimpleRecord.cs | 2 +- Simple.Data/SimpleResultSet.cs | 643 +- packages/NUnit.2.6.2/NUnit.2.6.2.nuspec | 27 + packages/NUnit.2.6.2/lib/nunit.framework.xml | 10899 ++++++++++++++++ packages/NUnit.2.6.2/license.txt | 15 + packages/repositories.config | 1 + 43 files changed, 12111 insertions(+), 690 deletions(-) create mode 100644 Simple.Data.Ado/GetExecutor.cs create mode 100644 Simple.Data.Ado/UpdateByCriteriaExecutor.cs create mode 100644 Simple.Data.Migrations.Tests/Class1.cs create mode 100644 Simple.Data.Migrations.Tests/Properties/AssemblyInfo.cs create mode 100644 Simple.Data.Migrations.Tests/Simple.Data.Migrations.Tests.csproj create mode 100644 Simple.Data.Migrations.Tests/packages.config create mode 100644 Simple.Data.Migrations/Class1.cs create mode 100644 Simple.Data.Migrations/Properties/AssemblyInfo.cs create mode 100644 Simple.Data.Migrations/Simple.Data.Migrations.csproj create mode 100644 packages/NUnit.2.6.2/NUnit.2.6.2.nuspec create mode 100644 packages/NUnit.2.6.2/lib/nunit.framework.xml create mode 100644 packages/NUnit.2.6.2/license.txt diff --git a/Simple.Data.Ado/AdoAdapter.IAdapterWithFunctions.cs b/Simple.Data.Ado/AdoAdapter.IAdapterWithFunctions.cs index ef6ec975..a15f667a 100644 --- a/Simple.Data.Ado/AdoAdapter.IAdapterWithFunctions.cs +++ b/Simple.Data.Ado/AdoAdapter.IAdapterWithFunctions.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; -using ResultSet = System.Collections.Generic.IEnumerable>>; +using ResultSet = System.Collections.Generic.IEnumerable>; namespace Simple.Data.Ado { @@ -11,7 +11,7 @@ public partial class AdoAdapter { private readonly ConcurrentDictionary _executors = new ConcurrentDictionary(); - public bool IsValidFunction(string functionName) + public override bool IsValidFunction(string functionName) { return _connectionProvider.SupportsStoredProcedures && _schema.IsProcedure(functionName); } @@ -25,7 +25,10 @@ public IEnumerable Execute(string functionName, IDictionary Execute(string functionName, IDictionary parameters, IAdapterTransaction transaction) { var executor = _executors.GetOrAdd(functionName, f => _connectionProvider.GetProcedureExecutor(this, _schema.BuildObjectName(f))); - return executor.Execute(parameters, ((AdoAdapterTransaction)transaction).DbTransaction); + return transaction == null + ? executor.Execute(parameters) + : executor.Execute(parameters, ((AdoAdapterTransaction) transaction).DbTransaction); + } } } diff --git a/Simple.Data.Ado/AdoAdapter.IAdapterWithRelation.cs b/Simple.Data.Ado/AdoAdapter.IAdapterWithRelation.cs index d9e3c4a6..7b636190 100644 --- a/Simple.Data.Ado/AdoAdapter.IAdapterWithRelation.cs +++ b/Simple.Data.Ado/AdoAdapter.IAdapterWithRelation.cs @@ -24,11 +24,12 @@ public bool IsValidRelation(string tableName, string relatedTableName) /// Name of the table. /// /// + /// /// The list of records matching the criteria. If no records are found, return an empty list. /// When implementing the interface, if relationships are not possible, throw a . - public object FindRelated(string tableName, IDictionary row, string relatedTableName) + public object FindRelated(string tableName, IDictionary row, string relatedTableName, DataStrategy database) { - return _relatedFinder.Value.FindRelated(tableName, row, relatedTableName); + return _relatedFinder.Value.FindRelated(tableName, row, relatedTableName, database); } } } \ No newline at end of file diff --git a/Simple.Data.Ado/AdoAdapter.cs b/Simple.Data.Ado/AdoAdapter.cs index 1f2442ad..1538a440 100644 --- a/Simple.Data.Ado/AdoAdapter.cs +++ b/Simple.Data.Ado/AdoAdapter.cs @@ -90,9 +90,9 @@ public override IEqualityComparer KeyComparer public override IReadOnlyDictionary GetKey(string tableName, IReadOnlyDictionary record) { - var homogenizedRecord = new Dictionary(HomogenizedEqualityComparer.DefaultInstance); - return GetKeyNames(tableName) - .Select(k => k.Homogenize()) + var homogenizedRecord = record.ToDictionary(HomogenizedEqualityComparer.DefaultInstance); + var keyNames = GetKeyNames(tableName).Select(k => k.Homogenize()).ToList(); + return keyNames .Where(homogenizedRecord.ContainsKey) .ToDictionary(key => key, key => homogenizedRecord[key]); } @@ -152,7 +152,7 @@ public OperationResult Execute(IOperation operation, IAdapterTransaction transac Func func; if (_executorFactory.TryGet(operation, out func)) { - return func(operation, this, null); + return func(operation, this, transaction as AdoAdapterTransaction); } throw new NotSupportedException(string.Format("Operation '{0}' is not supported by the current database.", operation.GetType().Name)); diff --git a/Simple.Data.Ado/AdoAdapterRelatedFinder.cs b/Simple.Data.Ado/AdoAdapterRelatedFinder.cs index 952170f9..297b3414 100644 --- a/Simple.Data.Ado/AdoAdapterRelatedFinder.cs +++ b/Simple.Data.Ado/AdoAdapterRelatedFinder.cs @@ -28,7 +28,7 @@ public bool IsValidRelation(string tableName, string relatedTableName) return TryJoin(tableName, relatedTableName) != null; } - public object FindRelated(string tableName, IDictionary row, string relatedTableName) + public object FindRelated(string tableName, IDictionary row, string relatedTableName, DataStrategy database) { var join = TryJoin(tableName, relatedTableName); if (join == null) throw new AdoAdapterException(string.Format("Could not resolve relationship of tables '{0}' and '{1}'.", tableName, relatedTableName)); @@ -37,7 +37,7 @@ public object FindRelated(string tableName, IDictionary row, str { return GetDetail(row, join); } - return GetMaster(row, join); + return GetMaster(row, join, database); } private TableJoin TryJoin(string tableName, string relatedTableName) @@ -61,12 +61,13 @@ private TableJoin TryDetailJoin(string tableName, string relatedTableName) return _adapter.GetSchema().FindTable(tableName).GetDetail(relatedTableName); } - private IDictionary GetMaster(IDictionary row, TableJoin masterJoin) + private IDictionary GetMaster(IDictionary row, TableJoin masterJoin, DataStrategy database) { - throw new NotImplementedException(); - //var criteria = new Dictionary { { masterJoin.MasterColumn.ActualName, row[masterJoin.DetailColumn.HomogenizedName] } }; - //return _adapter.RunQuery(new QueryOperation(new QueryOperation(_adapter, masterJoin.Master.ActualName, ExpressionHelper.CriteriaDictionaryToExpression(masterJoin.Master.ActualName, - // criteria))).FirstOrDefault(); + //throw new NotImplementedException(); + var criteria = new Dictionary { { masterJoin.MasterColumn.ActualName, row[masterJoin.DetailColumn.HomogenizedName] } }; + var expression = ExpressionHelper.CriteriaDictionaryToExpression(masterJoin.Master.ActualName, criteria); + IEnumerable _; + return _adapter.RunQuery(new SimpleQuery(database, masterJoin.Master.ActualName).Where(expression), null, out _).FirstOrDefault(); } private SimpleQuery GetDetail(IDictionary row, TableJoin join) diff --git a/Simple.Data.Ado/ExecutorFactory.cs b/Simple.Data.Ado/ExecutorFactory.cs index f7352c9a..f109a2a3 100644 --- a/Simple.Data.Ado/ExecutorFactory.cs +++ b/Simple.Data.Ado/ExecutorFactory.cs @@ -19,9 +19,18 @@ private static FuncDict CreateFunctionDictionary() dict.Add(CreateFunction(InsertExecutor.ExecuteInsert)); dict.Add(CreateFunction(UpdateEntityExecutor.ExecuteUpdateEntity)); dict.Add(CreateFunction(DeleteExecutor.Execute)); + dict.Add(CreateFunction(GetExecutor.ExecuteGet)); + dict.Add(CreateFunction(UpdateByCriteriaExecutor.ExecuteUpdate)); + dict.Add(CreateFunction(ExecuteFunction)); return (FuncDict)dict; } + private static OperationResult ExecuteFunction(FunctionOperation operation, AdoAdapter adapter, AdoAdapterTransaction transaction) + { + var result = adapter.Execute(operation.FunctionName, operation.Parameters, transaction); + return new MultiDataResult(result); + } + private static KeyValuePair CreateFunction(Func target) { ExecuteFunc func = (o, a, t) => target((T)o, a, t); diff --git a/Simple.Data.Ado/GetExecutor.cs b/Simple.Data.Ado/GetExecutor.cs new file mode 100644 index 00000000..5f3a352b --- /dev/null +++ b/Simple.Data.Ado/GetExecutor.cs @@ -0,0 +1,15 @@ +namespace Simple.Data.Ado +{ + using Operations; + + internal class GetExecutor + { + public static OperationResult ExecuteGet(GetOperation operation, AdoAdapter adapter, AdoAdapterTransaction transaction) + { + var getter = transaction == null + ? new AdoAdapterGetter(adapter) + : new AdoAdapterGetter(adapter, transaction.DbTransaction); + return new DataResult(getter.Get(operation.TableName, operation.KeyValues)); + } + } +} \ No newline at end of file diff --git a/Simple.Data.Ado/QueryBuilderBase.cs b/Simple.Data.Ado/QueryBuilderBase.cs index 66309607..b37b90e1 100644 --- a/Simple.Data.Ado/QueryBuilderBase.cs +++ b/Simple.Data.Ado/QueryBuilderBase.cs @@ -263,7 +263,8 @@ protected IEnumerable GetObjectReferences(IEnumerable + @@ -156,6 +157,7 @@ + diff --git a/Simple.Data.Ado/UpdateByCriteriaExecutor.cs b/Simple.Data.Ado/UpdateByCriteriaExecutor.cs new file mode 100644 index 00000000..bab7f976 --- /dev/null +++ b/Simple.Data.Ado/UpdateByCriteriaExecutor.cs @@ -0,0 +1,13 @@ +namespace Simple.Data.Ado +{ + using Operations; + + internal class UpdateByCriteriaExecutor + { + public static OperationResult ExecuteUpdate(UpdateByCriteriaOperation operation, AdoAdapter adapter, AdoAdapterTransaction transaction) + { + ICommandBuilder commandBuilder = new UpdateHelper(adapter.GetSchema()).GetUpdateCommand(operation.TableName, operation.Data, operation.Criteria); + return new CommandResult(adapter.Execute(commandBuilder)); + } + } +} \ No newline at end of file diff --git a/Simple.Data.Ado/UpdateEntityExecutor.cs b/Simple.Data.Ado/UpdateEntityExecutor.cs index 166ae710..3968a880 100644 --- a/Simple.Data.Ado/UpdateEntityExecutor.cs +++ b/Simple.Data.Ado/UpdateEntityExecutor.cs @@ -18,11 +18,22 @@ public static CommandResult ExecuteUpdateEntity(UpdateEntityOperation operation, return BulkUpdateEntity(operation, adapter, transaction, checkedEnumerable); } + SimpleExpression criteria; + if (operation.Originals != null) + { + var newValuesDict = checkedEnumerable.Single; + var originalValuesDict = operation.Originals.Single(); + criteria = CreateCriteriaFromOriginalValues(adapter, operation.TableName, newValuesDict, originalValuesDict); + var changedValuesDict = CreateChangedValuesDict(newValuesDict, originalValuesDict); + return new CommandResult(Update(adapter, operation.TableName, changedValuesDict, criteria, transaction.TransactionOrDefault())); + } + string[] keyFieldNames = adapter.GetKeyNames(operation.TableName).ToArray(); if (keyFieldNames.Length == 0) throw new AdoAdapterException(string.Format("No primary key found for implicit update of table '{0}'.", operation.TableName)); var dict = checkedEnumerable.Single; - return new CommandResult(Update(adapter, operation.TableName, checkedEnumerable.Single, Adapter.GetCriteria(operation.TableName, keyFieldNames, ref dict), transaction.TransactionOrDefault())); + criteria = Adapter.GetCriteria(operation.TableName, keyFieldNames, ref dict); + return new CommandResult(Update(adapter, operation.TableName, dict, criteria, transaction.TransactionOrDefault())); } private static int Update(AdoAdapter adapter, string tableName, IReadOnlyDictionary data, SimpleExpression criteria, IDbTransaction transaction) @@ -46,5 +57,38 @@ private static CommandResult BulkUpdateEntity(UpdateEntityOperation operation, A new CommandResult(bulkUpdater.Update(adapter, operation.TableName, checkedEnumerable, transaction.TransactionOrDefault())); } + + private static Dictionary CreateChangedValuesDict( + IEnumerable> newValuesDict, IReadOnlyDictionary originalValuesDict) + { + var changedValuesDict = + newValuesDict.Where( + kvp => + (!originalValuesDict.ContainsKey(kvp.Key)) || !(Equals(kvp.Value, originalValuesDict[kvp.Key]))) + .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); + return changedValuesDict; + } + + private static SimpleExpression CreateCriteriaFromOriginalValues(AdoAdapter adapter, string tableName, + IReadOnlyDictionary newValuesDict, + IReadOnlyDictionary + originalValuesDict) + { + var criteriaValues = adapter.GetKey(tableName, originalValuesDict).ToDictionary(); + + foreach (var kvp in originalValuesDict + .Where( + originalKvp => + newValuesDict.ContainsKey(originalKvp.Key) && + !(Equals(newValuesDict[originalKvp.Key], originalKvp.Value)))) + { + if (!criteriaValues.ContainsKey(kvp.Key)) + { + criteriaValues.Add(kvp); + } + }; + + return ExpressionHelper.CriteriaDictionaryToExpression(tableName, criteriaValues); + } } } \ No newline at end of file diff --git a/Simple.Data.BehaviourTest/Query/QueryTest.cs b/Simple.Data.BehaviourTest/Query/QueryTest.cs index c4749644..a088b549 100644 --- a/Simple.Data.BehaviourTest/Query/QueryTest.cs +++ b/Simple.Data.BehaviourTest/Query/QueryTest.cs @@ -240,11 +240,5 @@ public void SpecifyOrderByDescendingWithoutReferenceThrowsException() { Assert.Throws(() => _db.Users.All().OrderByDescending(1)); } - - [Test] - public void CallingFirstOnTableShouldThrowInvalidOperationException() - { - Assert.Throws(() => _db.Users.First()); - } } } diff --git a/Simple.Data.BehaviourTest/SchemaQualifiedTableTest.cs b/Simple.Data.BehaviourTest/SchemaQualifiedTableTest.cs index 46a83acb..daa78216 100644 --- a/Simple.Data.BehaviourTest/SchemaQualifiedTableTest.cs +++ b/Simple.Data.BehaviourTest/SchemaQualifiedTableTest.cs @@ -27,7 +27,7 @@ static Database CreateDatabase(MockDatabase mockDatabase) return new Database(new AdoAdapter(new MockConnectionProvider(new MockDbConnection(mockDatabase), mockSchemaProvider))); } - private const string usersColumns = "[foo].[users].[id], [foo].[users].[name], [foo].[users].[password], [foo].[users].[age]"; + private const string usersColumns = "[foo].[users].[id],[foo].[users].[name],[foo].[users].[password],[foo].[users].[age]"; [Test] public void TestFindEqualWithInt32() @@ -253,7 +253,7 @@ public void TestFindWithDotInSchemaName() var mockDatabase = new MockDatabase(); dynamic database = CreateDatabase(mockDatabase); database.foobar.Test.Find(database.foobar.Test.Id == 1); - Assert.AreEqual("select [foo.bar].[Test].[Id], [foo.bar].[Test].[Value] from [foo.bar].[Test] where [foo.bar].[Test].[id] = @p1".ToLowerInvariant(), mockDatabase.Sql.ToLowerInvariant()); + Assert.AreEqual("select [foo.bar].[Test].[Id],[foo.bar].[Test].[Value] from [foo.bar].[Test] where [foo.bar].[Test].[id] = @p1".ToLowerInvariant(), mockDatabase.Sql.ToLowerInvariant()); Assert.AreEqual(1, mockDatabase.Parameters[0]); } } diff --git a/Simple.Data.BehaviourTest/TransactionTest.cs b/Simple.Data.BehaviourTest/TransactionTest.cs index 416a1982..44be9400 100644 --- a/Simple.Data.BehaviourTest/TransactionTest.cs +++ b/Simple.Data.BehaviourTest/TransactionTest.cs @@ -26,7 +26,7 @@ static Database CreateDatabase(MockDatabase mockDatabase) return new Database(new AdoAdapter(new MockConnectionProvider(new MockDbConnection(mockDatabase), mockSchemaProvider))); } - private const string usersColumns = "[dbo].[Users].[Id], [dbo].[Users].[Name], [dbo].[Users].[Password], [dbo].[Users].[Age]"; + private const string usersColumns = "[dbo].[Users].[Id],[dbo].[Users].[Name],[dbo].[Users].[Password],[dbo].[Users].[Age]"; [Test] public void TestFindEqualWithInt32() diff --git a/Simple.Data.Migrations.Tests/Class1.cs b/Simple.Data.Migrations.Tests/Class1.cs new file mode 100644 index 00000000..6213ccac --- /dev/null +++ b/Simple.Data.Migrations.Tests/Class1.cs @@ -0,0 +1,9 @@ +namespace Simple.Data.Migrations.Tests +{ + using NUnit.Framework; + + [TestFixture] + public class TableCreationTests + { + } +} diff --git a/Simple.Data.Migrations.Tests/Properties/AssemblyInfo.cs b/Simple.Data.Migrations.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..4f5a3d44 --- /dev/null +++ b/Simple.Data.Migrations.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Simple.Data.Migrations.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Simple.Data.Migrations.Tests")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("7700ef48-4ce5-4182-9b4e-f7b571af67ec")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Simple.Data.Migrations.Tests/Simple.Data.Migrations.Tests.csproj b/Simple.Data.Migrations.Tests/Simple.Data.Migrations.Tests.csproj new file mode 100644 index 00000000..0833795a --- /dev/null +++ b/Simple.Data.Migrations.Tests/Simple.Data.Migrations.Tests.csproj @@ -0,0 +1,59 @@ + + + + + Debug + AnyCPU + {9F110A91-DC67-48C1-894D-B36650F38DE1} + Library + Properties + Simple.Data.Migrations.Tests + Simple.Data.Migrations.Tests + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\NUnit.2.6.2\lib\nunit.framework.dll + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Simple.Data.Migrations.Tests/packages.config b/Simple.Data.Migrations.Tests/packages.config new file mode 100644 index 00000000..daee5f55 --- /dev/null +++ b/Simple.Data.Migrations.Tests/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Simple.Data.Migrations/Class1.cs b/Simple.Data.Migrations/Class1.cs new file mode 100644 index 00000000..72bf6855 --- /dev/null +++ b/Simple.Data.Migrations/Class1.cs @@ -0,0 +1,92 @@ +namespace Simple.Data.Migrations +{ + using System; + using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.Linq; + using System.Reflection; + + public class Migration + { + private readonly List _tables = new List
(); + public Table AddTableFor() + { + var table = new Table(); + table.CreateDefaultColumns(); + _tables.Add(table); + return table; + } + } + + public class Table + { + private readonly Type _type; + private readonly List _columns = new List(); + + internal Table(Type type) + { + _type = type; + } + + public ReadOnlyCollection Columns + { + get { return _columns.AsReadOnly(); } + } + + public Table AddColumn(Column column) + { + _columns.Add(column); + return this; + } + + public Table AddColumns(IEnumerable columns) + { + _columns.AddRange(columns); + return this; + } + } + + public class Table : Table + { + internal Table() : base(typeof(T)) + { + } + + public void CreateDefaultColumns() + { + AddColumns( + typeof (T).GetProperties(BindingFlags.Instance | BindingFlags.Public) + .Select(Column.FromProperty) + ); + } + } + + public class ColumnCollection : KeyedCollection + { + protected override string GetKeyForItem(Column item) + { + return item.Name; + } + } + + public class Column + { + private readonly string _name; + + public Column(string name) + { + _name = name; + } + + public string Name + { + get { return _name; } + } + + internal static Column FromProperty(PropertyInfo property) + { + if (property == null) throw new ArgumentNullException("property"); + return new Column(property.Name); + } + } +} diff --git a/Simple.Data.Migrations/Properties/AssemblyInfo.cs b/Simple.Data.Migrations/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..201155bc --- /dev/null +++ b/Simple.Data.Migrations/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Simple.Data.Migrations")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Simple.Data.Migrations")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("454bad30-06b5-42e4-9987-0a1e894081f7")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Simple.Data.Migrations/Simple.Data.Migrations.csproj b/Simple.Data.Migrations/Simple.Data.Migrations.csproj new file mode 100644 index 00000000..3d1de23f --- /dev/null +++ b/Simple.Data.Migrations/Simple.Data.Migrations.csproj @@ -0,0 +1,53 @@ + + + + + Debug + AnyCPU + {20E3FA44-D775-4A1C-88EA-D56D9C60E661} + Library + Properties + Simple.Data.Migrations + Simple.Data.Migrations + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Simple.Data.UnitTest/BinderHelperTest.cs b/Simple.Data.UnitTest/BinderHelperTest.cs index f52dbaa6..6bb75c2c 100644 --- a/Simple.Data.UnitTest/BinderHelperTest.cs +++ b/Simple.Data.UnitTest/BinderHelperTest.cs @@ -23,7 +23,7 @@ public void NamedArgumentsToDictionaryShouldApplyNamesToLastArguments() public void ArgumentsToDictionaryShouldApplyOrdinalNamesToFirstArguments() { var binder = new TestInvokeMemberBinder("Test", false, new CallInfo(2, "Foo")); - var actual = binder.ArgumentsToDictionary(new object[] { 1, 2 }); + var actual = binder.ArgumentsToReadOnlyDictionary(new object[] { 1, 2 }); Assert.AreEqual("_0", actual.First().Key); } @@ -32,7 +32,7 @@ public void ArgumentsToDictionaryShouldReturnInputParameterWhenInputParameterIsD { var binder = new TestInvokeMemberBinder("Test", false, new CallInfo(1, "Foo")); var input = new Dictionary { { "Test1", 1 }, { "Test2", 2 } }; - var actual = binder.ArgumentsToDictionary(new object[] { input }); + var actual = binder.ArgumentsToReadOnlyDictionary(new object[] { input }); Assert.AreEqual(input["Test2"], actual["Test2"]); } } diff --git a/Simple.Data.sln b/Simple.Data.sln index 6373b381..7ff2b09c 100644 --- a/Simple.Data.sln +++ b/Simple.Data.sln @@ -1,312 +1,347 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.20827.3 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data", "Simple.Data\Simple.Data.csproj", "{148CEE80-2E84-4ABD-B5AB-20415B2BBD21}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{10F43335-5672-4BDA-91BB-5311C2BFA409}" - ProjectSection(SolutionItems) = preProject - CommonAssemblyInfo.cs = CommonAssemblyInfo.cs - README.md = README.md - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.UnitTest", "Simple.Data.UnitTest\Simple.Data.UnitTest.csproj", "{1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Assemblies", "Assemblies", "{BA656253-3472-4A47-8640-976E89465B6F}" - ProjectSection(SolutionItems) = preProject - Assemblies\sqlceca35.dll = Assemblies\sqlceca35.dll - Assemblies\sqlcecompact35.dll = Assemblies\sqlcecompact35.dll - Assemblies\sqlceer35EN.dll = Assemblies\sqlceer35EN.dll - Assemblies\sqlceme35.dll = Assemblies\sqlceme35.dll - Assemblies\sqlceoledb35.dll = Assemblies\sqlceoledb35.dll - Assemblies\sqlceqp35.dll = Assemblies\sqlceqp35.dll - Assemblies\sqlcese35.dll = Assemblies\sqlcese35.dll - Assemblies\System.Data.SqlServerCe.dll = Assemblies\System.Data.SqlServerCe.dll - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.SqlTest", "Simple.Data.SqlTest\Simple.Data.SqlTest.csproj", "{EFA5B19B-D24F-497E-AB48-8588ABFD1D01}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{182AEEFE-9B89-4264-BCED-91A00D1EF896}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.SqlServer", "Simple.Data.SqlServer\Simple.Data.SqlServer.csproj", "{E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.AdapterApi", "Simple.Data.AdapterApi\Simple.Data.AdapterApi.csproj", "{67ACEAD5-B457-4B52-9C55-611A61A73B56}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.Ado", "Simple.Data.Ado\Simple.Data.Ado.csproj", "{ECC2D7DB-EC7F-44B6-B09F-5B471C629685}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.Ado.Test", "Simple.Data.Ado.Test\Simple.Data.Ado.Test.csproj", "{96C623FD-869E-4DCE-98A1-17075EE384F9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.BehaviourTest", "Simple.Data.BehaviourTest\Simple.Data.BehaviourTest.csproj", "{70536BA8-AF0D-46F3-B04C-45177F56B320}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.SqlCe40", "Simple.Data.SqlCe40\Simple.Data.SqlCe40.csproj", "{43BA3D2C-10D8-470D-A60B-4F06D2F9D539}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.SqlCe40Test", "Simple.Data.SqlCe40Test\Simple.Data.SqlCe40Test.csproj", "{E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.TestHelper", "Simple.Data.TestHelper\Simple.Data.TestHelper.csproj", "{7DAB2F13-0392-435E-A934-4567266714BF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PerformanceTestConsole", "PerformanceTestConsole\PerformanceTestConsole.csproj", "{C88EA51F-59C4-4283-97AC-06440F4AA4F6}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Profiling", "Profiling", "{2AAC5DFA-3851-4324-A51F-5BC46BEB777C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProfilingApp", "ProfilingApp\ProfilingApp.csproj", "{9AAF3008-8033-4A26-93D2-97928E7801E9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.InMemoryTest", "Simple.Data.InMemoryTest\Simple.Data.InMemoryTest.csproj", "{1B6A87C0-4ACA-4411-8879-844537A52126}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.Mocking", "Simple.Data.Mocking\Simple.Data.Mocking.csproj", "{292611F6-BBBD-492D-891C-0D9FB4BF5433}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|Mixed Platforms = Debug|Mixed Platforms - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|Mixed Platforms = Release|Mixed Platforms - Release|x86 = Release|x86 - Release-Mono|Any CPU = Release-Mono|Any CPU - Release-Mono|Mixed Platforms = Release-Mono|Mixed Platforms - Release-Mono|x86 = Release-Mono|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Debug|Any CPU.Build.0 = Debug|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Debug|x86.ActiveCfg = Debug|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release|Any CPU.ActiveCfg = Release|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release|Any CPU.Build.0 = Release|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release|x86.ActiveCfg = Release|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Debug|x86.ActiveCfg = Debug|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release|Any CPU.Build.0 = Release|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release|x86.ActiveCfg = Release|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Debug|x86.ActiveCfg = Debug|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release|Any CPU.Build.0 = Release|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release|x86.ActiveCfg = Release|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Debug|x86.ActiveCfg = Debug|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release|Any CPU.Build.0 = Release|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release|x86.ActiveCfg = Release|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Debug|Any CPU.Build.0 = Debug|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Debug|x86.ActiveCfg = Debug|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release|Any CPU.ActiveCfg = Release|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release|Any CPU.Build.0 = Release|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release|x86.ActiveCfg = Release|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release-Mono|Any CPU.ActiveCfg = Release|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release-Mono|Any CPU.Build.0 = Release|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release-Mono|Mixed Platforms.ActiveCfg = Release|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release-Mono|Mixed Platforms.Build.0 = Release|Any CPU - {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release-Mono|x86.ActiveCfg = Release|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Debug|x86.ActiveCfg = Debug|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release|Any CPU.Build.0 = Release|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release|x86.ActiveCfg = Release|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Debug|x86.ActiveCfg = Debug|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release|Any CPU.Build.0 = Release|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release|x86.ActiveCfg = Release|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU - {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Debug|Any CPU.Build.0 = Debug|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Debug|x86.ActiveCfg = Debug|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release|Any CPU.ActiveCfg = Release|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release|Any CPU.Build.0 = Release|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release|x86.ActiveCfg = Release|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU - {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Debug|Any CPU.Build.0 = Debug|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Debug|x86.ActiveCfg = Debug|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release|Any CPU.ActiveCfg = Release|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release|Any CPU.Build.0 = Release|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release|x86.ActiveCfg = Release|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release-Mono|Any CPU.ActiveCfg = Release|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release-Mono|Any CPU.Build.0 = Release|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release-Mono|Mixed Platforms.ActiveCfg = Release|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release-Mono|Mixed Platforms.Build.0 = Release|Any CPU - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release-Mono|x86.ActiveCfg = Release|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Debug|x86.ActiveCfg = Debug|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release|Any CPU.Build.0 = Release|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release|x86.ActiveCfg = Release|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release-Mono|Any CPU.ActiveCfg = Release|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release-Mono|Any CPU.Build.0 = Release|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release-Mono|Mixed Platforms.ActiveCfg = Release|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release-Mono|Mixed Platforms.Build.0 = Release|Any CPU - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release-Mono|x86.ActiveCfg = Release|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Debug|x86.ActiveCfg = Debug|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Release|Any CPU.Build.0 = Release|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Release|x86.ActiveCfg = Release|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU - {7DAB2F13-0392-435E-A934-4567266714BF}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Debug|Any CPU.ActiveCfg = Debug|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Debug|x86.ActiveCfg = Debug|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Debug|x86.Build.0 = Debug|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release|Any CPU.ActiveCfg = Release|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release|Mixed Platforms.Build.0 = Release|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release|x86.ActiveCfg = Release|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release|x86.Build.0 = Release|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release-Mono|Any CPU.ActiveCfg = Release|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release-Mono|Mixed Platforms.ActiveCfg = Release|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release-Mono|Mixed Platforms.Build.0 = Release|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release-Mono|x86.ActiveCfg = Release|x86 - {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release-Mono|x86.Build.0 = Release|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Debug|Any CPU.ActiveCfg = Debug|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Debug|x86.ActiveCfg = Debug|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Debug|x86.Build.0 = Debug|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release|Any CPU.ActiveCfg = Release|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release|Mixed Platforms.Build.0 = Release|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release|x86.ActiveCfg = Release|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release|x86.Build.0 = Release|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release-Mono|Any CPU.ActiveCfg = Release|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release-Mono|Mixed Platforms.ActiveCfg = Release|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release-Mono|Mixed Platforms.Build.0 = Release|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release-Mono|x86.ActiveCfg = Release|x86 - {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release-Mono|x86.Build.0 = Release|x86 - {1B6A87C0-4ACA-4411-8879-844537A52126}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Debug|x86.ActiveCfg = Debug|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Release|Any CPU.Build.0 = Release|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Release|x86.ActiveCfg = Release|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU - {1B6A87C0-4ACA-4411-8879-844537A52126}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Debug|Any CPU.Build.0 = Debug|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Debug|x86.ActiveCfg = Debug|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release|Any CPU.ActiveCfg = Release|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release|Any CPU.Build.0 = Release|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release|x86.ActiveCfg = Release|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU - {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} - {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} - {96C623FD-869E-4DCE-98A1-17075EE384F9} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} - {70536BA8-AF0D-46F3-B04C-45177F56B320} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} - {1B6A87C0-4ACA-4411-8879-844537A52126} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} - {9AAF3008-8033-4A26-93D2-97928E7801E9} = {2AAC5DFA-3851-4324-A51F-5BC46BEB777C} - EndGlobalSection - GlobalSection(NDepend) = preSolution - Project = ".\Simple_Data.ndproj" - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.20827.3 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data", "Simple.Data\Simple.Data.csproj", "{148CEE80-2E84-4ABD-B5AB-20415B2BBD21}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{10F43335-5672-4BDA-91BB-5311C2BFA409}" + ProjectSection(SolutionItems) = preProject + CommonAssemblyInfo.cs = CommonAssemblyInfo.cs + README.md = README.md + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.UnitTest", "Simple.Data.UnitTest\Simple.Data.UnitTest.csproj", "{1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Assemblies", "Assemblies", "{BA656253-3472-4A47-8640-976E89465B6F}" + ProjectSection(SolutionItems) = preProject + Assemblies\sqlceca35.dll = Assemblies\sqlceca35.dll + Assemblies\sqlcecompact35.dll = Assemblies\sqlcecompact35.dll + Assemblies\sqlceer35EN.dll = Assemblies\sqlceer35EN.dll + Assemblies\sqlceme35.dll = Assemblies\sqlceme35.dll + Assemblies\sqlceoledb35.dll = Assemblies\sqlceoledb35.dll + Assemblies\sqlceqp35.dll = Assemblies\sqlceqp35.dll + Assemblies\sqlcese35.dll = Assemblies\sqlcese35.dll + Assemblies\System.Data.SqlServerCe.dll = Assemblies\System.Data.SqlServerCe.dll + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.SqlTest", "Simple.Data.SqlTest\Simple.Data.SqlTest.csproj", "{EFA5B19B-D24F-497E-AB48-8588ABFD1D01}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{182AEEFE-9B89-4264-BCED-91A00D1EF896}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.SqlServer", "Simple.Data.SqlServer\Simple.Data.SqlServer.csproj", "{E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.AdapterApi", "Simple.Data.AdapterApi\Simple.Data.AdapterApi.csproj", "{67ACEAD5-B457-4B52-9C55-611A61A73B56}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.Ado", "Simple.Data.Ado\Simple.Data.Ado.csproj", "{ECC2D7DB-EC7F-44B6-B09F-5B471C629685}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.Ado.Test", "Simple.Data.Ado.Test\Simple.Data.Ado.Test.csproj", "{96C623FD-869E-4DCE-98A1-17075EE384F9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.BehaviourTest", "Simple.Data.BehaviourTest\Simple.Data.BehaviourTest.csproj", "{70536BA8-AF0D-46F3-B04C-45177F56B320}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.SqlCe40", "Simple.Data.SqlCe40\Simple.Data.SqlCe40.csproj", "{43BA3D2C-10D8-470D-A60B-4F06D2F9D539}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.SqlCe40Test", "Simple.Data.SqlCe40Test\Simple.Data.SqlCe40Test.csproj", "{E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.TestHelper", "Simple.Data.TestHelper\Simple.Data.TestHelper.csproj", "{7DAB2F13-0392-435E-A934-4567266714BF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PerformanceTestConsole", "PerformanceTestConsole\PerformanceTestConsole.csproj", "{C88EA51F-59C4-4283-97AC-06440F4AA4F6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Profiling", "Profiling", "{2AAC5DFA-3851-4324-A51F-5BC46BEB777C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProfilingApp", "ProfilingApp\ProfilingApp.csproj", "{9AAF3008-8033-4A26-93D2-97928E7801E9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.InMemoryTest", "Simple.Data.InMemoryTest\Simple.Data.InMemoryTest.csproj", "{1B6A87C0-4ACA-4411-8879-844537A52126}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.Mocking", "Simple.Data.Mocking\Simple.Data.Mocking.csproj", "{292611F6-BBBD-492D-891C-0D9FB4BF5433}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.Migrations", "Simple.Data.Migrations\Simple.Data.Migrations.csproj", "{20E3FA44-D775-4A1C-88EA-D56D9C60E661}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.Migrations.Tests", "Simple.Data.Migrations.Tests\Simple.Data.Migrations.Tests.csproj", "{9F110A91-DC67-48C1-894D-B36650F38DE1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms + Release|x86 = Release|x86 + Release-Mono|Any CPU = Release-Mono|Any CPU + Release-Mono|Mixed Platforms = Release-Mono|Mixed Platforms + Release-Mono|x86 = Release-Mono|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Debug|Any CPU.Build.0 = Debug|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Debug|x86.ActiveCfg = Debug|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release|Any CPU.ActiveCfg = Release|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release|Any CPU.Build.0 = Release|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release|x86.ActiveCfg = Release|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Debug|x86.ActiveCfg = Debug|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release|Any CPU.Build.0 = Release|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release|x86.ActiveCfg = Release|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Debug|x86.ActiveCfg = Debug|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release|Any CPU.Build.0 = Release|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release|x86.ActiveCfg = Release|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Debug|x86.ActiveCfg = Debug|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release|Any CPU.Build.0 = Release|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release|x86.ActiveCfg = Release|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Debug|Any CPU.Build.0 = Debug|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Debug|x86.ActiveCfg = Debug|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release|Any CPU.ActiveCfg = Release|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release|Any CPU.Build.0 = Release|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release|x86.ActiveCfg = Release|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release-Mono|Any CPU.ActiveCfg = Release|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release-Mono|Any CPU.Build.0 = Release|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release-Mono|Mixed Platforms.ActiveCfg = Release|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release-Mono|Mixed Platforms.Build.0 = Release|Any CPU + {67ACEAD5-B457-4B52-9C55-611A61A73B56}.Release-Mono|x86.ActiveCfg = Release|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Debug|x86.ActiveCfg = Debug|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release|Any CPU.Build.0 = Release|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release|x86.ActiveCfg = Release|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Debug|x86.ActiveCfg = Debug|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release|Any CPU.Build.0 = Release|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release|x86.ActiveCfg = Release|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU + {96C623FD-869E-4DCE-98A1-17075EE384F9}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Debug|x86.ActiveCfg = Debug|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release|Any CPU.ActiveCfg = Release|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release|Any CPU.Build.0 = Release|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release|x86.ActiveCfg = Release|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU + {70536BA8-AF0D-46F3-B04C-45177F56B320}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Debug|Any CPU.Build.0 = Debug|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Debug|x86.ActiveCfg = Debug|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release|Any CPU.ActiveCfg = Release|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release|Any CPU.Build.0 = Release|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release|x86.ActiveCfg = Release|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release-Mono|Any CPU.ActiveCfg = Release|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release-Mono|Any CPU.Build.0 = Release|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release-Mono|Mixed Platforms.ActiveCfg = Release|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release-Mono|Mixed Platforms.Build.0 = Release|Any CPU + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539}.Release-Mono|x86.ActiveCfg = Release|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Debug|x86.ActiveCfg = Debug|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release|Any CPU.Build.0 = Release|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release|x86.ActiveCfg = Release|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release-Mono|Any CPU.ActiveCfg = Release|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release-Mono|Any CPU.Build.0 = Release|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release-Mono|Mixed Platforms.ActiveCfg = Release|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release-Mono|Mixed Platforms.Build.0 = Release|Any CPU + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB}.Release-Mono|x86.ActiveCfg = Release|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Debug|x86.ActiveCfg = Debug|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Release|Any CPU.Build.0 = Release|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Release|x86.ActiveCfg = Release|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU + {7DAB2F13-0392-435E-A934-4567266714BF}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Debug|Any CPU.ActiveCfg = Debug|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Debug|x86.ActiveCfg = Debug|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Debug|x86.Build.0 = Debug|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release|Any CPU.ActiveCfg = Release|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release|Mixed Platforms.Build.0 = Release|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release|x86.ActiveCfg = Release|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release|x86.Build.0 = Release|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release-Mono|Any CPU.ActiveCfg = Release|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release-Mono|Mixed Platforms.ActiveCfg = Release|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release-Mono|Mixed Platforms.Build.0 = Release|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release-Mono|x86.ActiveCfg = Release|x86 + {C88EA51F-59C4-4283-97AC-06440F4AA4F6}.Release-Mono|x86.Build.0 = Release|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Debug|Any CPU.ActiveCfg = Debug|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Debug|x86.ActiveCfg = Debug|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Debug|x86.Build.0 = Debug|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release|Any CPU.ActiveCfg = Release|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release|Mixed Platforms.Build.0 = Release|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release|x86.ActiveCfg = Release|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release|x86.Build.0 = Release|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release-Mono|Any CPU.ActiveCfg = Release|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release-Mono|Mixed Platforms.ActiveCfg = Release|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release-Mono|Mixed Platforms.Build.0 = Release|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release-Mono|x86.ActiveCfg = Release|x86 + {9AAF3008-8033-4A26-93D2-97928E7801E9}.Release-Mono|x86.Build.0 = Release|x86 + {1B6A87C0-4ACA-4411-8879-844537A52126}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Debug|x86.ActiveCfg = Debug|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Release|Any CPU.Build.0 = Release|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Release|x86.ActiveCfg = Release|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU + {1B6A87C0-4ACA-4411-8879-844537A52126}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Debug|Any CPU.Build.0 = Debug|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Debug|x86.ActiveCfg = Debug|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release|Any CPU.ActiveCfg = Release|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release|Any CPU.Build.0 = Release|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release|x86.ActiveCfg = Release|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release-Mono|Any CPU.ActiveCfg = Release-Mono|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release-Mono|Any CPU.Build.0 = Release-Mono|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release-Mono|Mixed Platforms.ActiveCfg = Release-Mono|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release-Mono|Mixed Platforms.Build.0 = Release-Mono|Any CPU + {292611F6-BBBD-492D-891C-0D9FB4BF5433}.Release-Mono|x86.ActiveCfg = Release-Mono|Any CPU + {20E3FA44-D775-4A1C-88EA-D56D9C60E661}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {20E3FA44-D775-4A1C-88EA-D56D9C60E661}.Debug|Any CPU.Build.0 = Debug|Any CPU + {20E3FA44-D775-4A1C-88EA-D56D9C60E661}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {20E3FA44-D775-4A1C-88EA-D56D9C60E661}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {20E3FA44-D775-4A1C-88EA-D56D9C60E661}.Debug|x86.ActiveCfg = Debug|Any CPU + {20E3FA44-D775-4A1C-88EA-D56D9C60E661}.Release|Any CPU.ActiveCfg = Release|Any CPU + {20E3FA44-D775-4A1C-88EA-D56D9C60E661}.Release|Any CPU.Build.0 = Release|Any CPU + {20E3FA44-D775-4A1C-88EA-D56D9C60E661}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {20E3FA44-D775-4A1C-88EA-D56D9C60E661}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {20E3FA44-D775-4A1C-88EA-D56D9C60E661}.Release|x86.ActiveCfg = Release|Any CPU + {20E3FA44-D775-4A1C-88EA-D56D9C60E661}.Release-Mono|Any CPU.ActiveCfg = Release|Any CPU + {20E3FA44-D775-4A1C-88EA-D56D9C60E661}.Release-Mono|Any CPU.Build.0 = Release|Any CPU + {20E3FA44-D775-4A1C-88EA-D56D9C60E661}.Release-Mono|Mixed Platforms.ActiveCfg = Release|Any CPU + {20E3FA44-D775-4A1C-88EA-D56D9C60E661}.Release-Mono|Mixed Platforms.Build.0 = Release|Any CPU + {20E3FA44-D775-4A1C-88EA-D56D9C60E661}.Release-Mono|x86.ActiveCfg = Release|Any CPU + {9F110A91-DC67-48C1-894D-B36650F38DE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9F110A91-DC67-48C1-894D-B36650F38DE1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9F110A91-DC67-48C1-894D-B36650F38DE1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {9F110A91-DC67-48C1-894D-B36650F38DE1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {9F110A91-DC67-48C1-894D-B36650F38DE1}.Debug|x86.ActiveCfg = Debug|Any CPU + {9F110A91-DC67-48C1-894D-B36650F38DE1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9F110A91-DC67-48C1-894D-B36650F38DE1}.Release|Any CPU.Build.0 = Release|Any CPU + {9F110A91-DC67-48C1-894D-B36650F38DE1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {9F110A91-DC67-48C1-894D-B36650F38DE1}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {9F110A91-DC67-48C1-894D-B36650F38DE1}.Release|x86.ActiveCfg = Release|Any CPU + {9F110A91-DC67-48C1-894D-B36650F38DE1}.Release-Mono|Any CPU.ActiveCfg = Release|Any CPU + {9F110A91-DC67-48C1-894D-B36650F38DE1}.Release-Mono|Any CPU.Build.0 = Release|Any CPU + {9F110A91-DC67-48C1-894D-B36650F38DE1}.Release-Mono|Mixed Platforms.ActiveCfg = Release|Any CPU + {9F110A91-DC67-48C1-894D-B36650F38DE1}.Release-Mono|Mixed Platforms.Build.0 = Release|Any CPU + {9F110A91-DC67-48C1-894D-B36650F38DE1}.Release-Mono|x86.ActiveCfg = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} + {1D2908F9-A78B-4EE1-8DAA-D4DBF3937C58} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} + {96C623FD-869E-4DCE-98A1-17075EE384F9} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} + {70536BA8-AF0D-46F3-B04C-45177F56B320} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} + {1B6A87C0-4ACA-4411-8879-844537A52126} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} + {9F110A91-DC67-48C1-894D-B36650F38DE1} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} + {9AAF3008-8033-4A26-93D2-97928E7801E9} = {2AAC5DFA-3851-4324-A51F-5BC46BEB777C} + EndGlobalSection + GlobalSection(NDepend) = preSolution + Project = ".\Simple_Data.ndproj" + EndGlobalSection +EndGlobal diff --git a/Simple.Data/Adapter.cs b/Simple.Data/Adapter.cs index 7bb921a3..531a9b8c 100644 --- a/Simple.Data/Adapter.cs +++ b/Simple.Data/Adapter.cs @@ -112,7 +112,7 @@ public static SimpleExpression GetCriteria(string tableName, IEnumerable } criteria.Add(criteriaFieldName, keyValuePair.Value); - data.Remove(keyValuePair); + data.Remove(keyValuePair.Key); } record = new ReadOnlyDictionary(data); return ExpressionHelper.CriteriaDictionaryToExpression(tableName, criteria); diff --git a/Simple.Data/BinderHelper.cs b/Simple.Data/BinderHelper.cs index 480d781d..42e4c834 100644 --- a/Simple.Data/BinderHelper.cs +++ b/Simple.Data/BinderHelper.cs @@ -19,7 +19,7 @@ private static IReadOnlyDictionary NamedArgumentsToDictionary(IE .ToReadOnlyDictionary(StringComparer.InvariantCultureIgnoreCase); } - private static IReadOnlyDictionary ArgumentsToDictionary(IEnumerable argumentNames, IEnumerable args) + private static IReadOnlyDictionary ArgumentsToReadOnlyDictionary(IEnumerable argumentNames, IEnumerable args) { var argsArray = args.ToArray(); if (argsArray.Length == 1 && argsArray[0] is IDictionary) @@ -37,9 +37,14 @@ internal static IReadOnlyDictionary NamedArgumentsToDictionary(t return NamedArgumentsToDictionary(binder.CallInfo.ArgumentNames, args); } - public static IReadOnlyDictionary ArgumentsToDictionary(this InvokeMemberBinder binder, IEnumerable args) + public static IDictionary ArgumentsToDictionary(this InvokeMemberBinder binder, IEnumerable args) { - return ArgumentsToDictionary(binder.CallInfo.ArgumentNames, args); + return ArgumentsToReadOnlyDictionary(binder.CallInfo.ArgumentNames, args).ToDictionary(); + } + + public static IReadOnlyDictionary ArgumentsToReadOnlyDictionary(this InvokeMemberBinder binder, IEnumerable args) + { + return ArgumentsToReadOnlyDictionary(binder.CallInfo.ArgumentNames, args); } internal static IReadOnlyDictionary NamedArgumentsToDictionary(this InvokeBinder binder, IEnumerable args) @@ -47,9 +52,14 @@ internal static IReadOnlyDictionary NamedArgumentsToDictionary(t return NamedArgumentsToDictionary(binder.CallInfo.ArgumentNames, args); } - public static IReadOnlyDictionary ArgumentsToDictionary(this InvokeBinder binder, IEnumerable args) + public static IReadOnlyDictionary ArgumentsToReadOnlyDictionary(this InvokeBinder binder, IEnumerable args) + { + return ArgumentsToReadOnlyDictionary(binder.CallInfo.ArgumentNames, args); + } + + public static IDictionary ArgumentsToDictionary(this InvokeBinder binder, IEnumerable args) { - return ArgumentsToDictionary(binder.CallInfo.ArgumentNames, args); + return ArgumentsToReadOnlyDictionary(binder.CallInfo.ArgumentNames, args).ToDictionary(); } } } diff --git a/Simple.Data/Commands/DeleteByCommand.cs b/Simple.Data/Commands/DeleteByCommand.cs index abfbb46d..e7ebaa96 100644 --- a/Simple.Data/Commands/DeleteByCommand.cs +++ b/Simple.Data/Commands/DeleteByCommand.cs @@ -17,7 +17,8 @@ public bool IsCommandFor(string method) public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMemberBinder binder, object[] args) { SimpleExpression criteriaExpression = GetCriteriaExpression(binder, args, table); - return dataStrategy.Run.Execute(new DeleteOperation(table.GetQualifiedName(), criteriaExpression)); + var commandResult = (CommandResult)dataStrategy.Run.Execute(new DeleteOperation(table.GetQualifiedName(), criteriaExpression)); + return commandResult.RowsAffected; } private static SimpleExpression GetCriteriaExpression(InvokeMemberBinder binder, object[] args, DynamicTable table) diff --git a/Simple.Data/Commands/ExecuteFunctionCommand.cs b/Simple.Data/Commands/ExecuteFunctionCommand.cs index 98d06cc4..59ab109b 100644 --- a/Simple.Data/Commands/ExecuteFunctionCommand.cs +++ b/Simple.Data/Commands/ExecuteFunctionCommand.cs @@ -14,9 +14,9 @@ public class ExecuteFunctionCommand private readonly DataStrategy _database; private readonly Adapter _adapter; private readonly string _functionName; - private readonly IReadOnlyDictionary _arguments; + private readonly IDictionary _arguments; - public ExecuteFunctionCommand(DataStrategy database, Adapter adapter, string functionName, IReadOnlyDictionary arguments) + public ExecuteFunctionCommand(DataStrategy database, Adapter adapter, string functionName, IDictionary arguments) { _database = database; _adapter = adapter; @@ -33,10 +33,10 @@ public bool Execute(out object result) private SimpleResultSet ToMultipleResultSets(object source) { if (source == null) return SimpleResultSet.Empty; - var resultSets = source as IEnumerable>>; + var resultSets = source as MultiDataResult; if (resultSets == null) throw new InvalidOperationException("Adapter returned incorrect Type."); - return ToMultipleDynamicEnumerables(resultSets); + return ToMultipleDynamicEnumerables(resultSets.Results); } private SimpleResultSet ToMultipleDynamicEnumerables(IEnumerable>> resultSets) diff --git a/Simple.Data/Commands/FindByCommand.cs b/Simple.Data/Commands/FindByCommand.cs index 78ed614e..f7918fc3 100644 --- a/Simple.Data/Commands/FindByCommand.cs +++ b/Simple.Data/Commands/FindByCommand.cs @@ -51,7 +51,7 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe CreateCriteriaDictionary(binder, args)); var result = (QueryResult)dataStrategy.Run.Execute(new QueryOperation(dataStrategy, table.GetQualifiedName(), criteriaExpression)); - return result.Data.FirstOrDefault(); + return result.Data.FirstOrDefault().ToDynamicRecord(table.GetQualifiedName(), dataStrategy); } public object Execute(DataStrategy dataStrategy, SimpleQuery query, InvokeMemberBinder binder, object[] args) diff --git a/Simple.Data/Commands/ResultHelper.cs b/Simple.Data/Commands/ResultHelper.cs index 9f0498de..d6517cab 100644 --- a/Simple.Data/Commands/ResultHelper.cs +++ b/Simple.Data/Commands/ResultHelper.cs @@ -7,15 +7,38 @@ namespace Simple.Data.Commands { using Extensions; + internal enum ExpectedResultType + { + Single, + Enumerable + } internal static class ResultHelper { public static object TypeResult(object result, DynamicTable table, DataStrategy dataStrategy) { + var dataResult = result as DataResult; + if (dataResult != null) + { + if (dataResult.Data == null) return null; + var checkedEnumerable = CheckedEnumerable.Create(dataResult.Data); + if (checkedEnumerable.IsEmpty) + { + return null; + } + if (checkedEnumerable.HasMoreThanOneValue) + { + return new SimpleResultSet(checkedEnumerable.Select(d => d.ToDynamicRecord(table.GetQualifiedName(), dataStrategy))); + } + return checkedEnumerable.Single.ToDynamicRecord(table.GetQualifiedName(), dataStrategy); + } var dictionary = result as IDictionary; if (dictionary != null) return dictionary.ToDynamicRecord(table.GetQualifiedName(), dataStrategy); var list = result as IEnumerable>; - if (list != null) return new SimpleResultSet(list.Select(d => d.ToDynamicRecord(table.GetQualifiedName(), dataStrategy))); + if (list != null) + { + return new SimpleResultSet(list.Select(d => d.ToDynamicRecord(table.GetQualifiedName(), dataStrategy))); + } return null; } diff --git a/Simple.Data/Commands/UpdateByCommand.cs b/Simple.Data/Commands/UpdateByCommand.cs index 78bb28a0..ffc5701e 100644 --- a/Simple.Data/Commands/UpdateByCommand.cs +++ b/Simple.Data/Commands/UpdateByCommand.cs @@ -27,18 +27,18 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), criteria); var data = binder.NamedArgumentsToDictionary(args) .Where(kvp => !criteria.ContainsKey(kvp.Key)) - .ToDictionary(); - return dataStrategy.Run.Execute(new UpdateEntityOperation(table.GetQualifiedName(), data.ToReadOnly())); + .ToReadOnlyDictionary(); + return dataStrategy.Run.Execute(new UpdateByCriteriaOperation(table.GetQualifiedName(), criteriaExpression, data)); } internal static object UpdateByKeyFields(string tableName, DataStrategy dataStrategy, object entity, IEnumerable keyFieldNames) { var record = UpdateCommand.ObjectToDictionary(entity); - var list = record as ICollection>; - if (list != null) return dataStrategy.Run.Execute(new UpdateEntityOperation(tableName, list.Select(d => d.ToReadOnly()).ToList())); + var list = record as ICollection>; + if (list != null) return dataStrategy.Run.Execute(new UpdateEntityOperation(tableName, list)); - var dict = record as IDictionary; - return dataStrategy.Run.Execute(new UpdateEntityOperation(tableName, dict.ToReadOnly())); + var dict = record as IReadOnlyDictionary; + return dataStrategy.Run.Execute(new UpdateEntityOperation(tableName, dict)); } private static IEnumerable> GetCriteria(IEnumerable keyFieldNames, IDictionary record) diff --git a/Simple.Data/Commands/UpdateCommand.cs b/Simple.Data/Commands/UpdateCommand.cs index 276f3f07..01ccc9b6 100644 --- a/Simple.Data/Commands/UpdateCommand.cs +++ b/Simple.Data/Commands/UpdateCommand.cs @@ -43,6 +43,7 @@ private static object UpdateUsingOriginalValues(DataStrategy dataStrategy, Dynam } var newValuesDict = newValues as IReadOnlyDictionary; + var originalValuesDict = ObjectToDictionary(args[1]) as IReadOnlyDictionary; if (originalValuesDict == null) throw new InvalidOperationException("Parameter type mismatch; both parameters to Update should be same type."); return dataStrategy.Run.Execute(new UpdateEntityOperation(table.GetQualifiedName(), newValuesDict, originalValuesDict)); @@ -56,8 +57,6 @@ private static object UpdateUsingKeys(DataStrategy dataStrategy, DynamicTable ta var dict = record as IReadOnlyDictionary; if (dict == null) throw new InvalidOperationException("Could not resolve data from passed object."); - var key = dataStrategy.GetAdapter().GetKey(table.GetQualifiedName(), dict); - dict = dict.Where(kvp => key.All(keyKvp => keyKvp.Key.Homogenize() != kvp.Key.Homogenize())).ToReadOnlyDictionary(); return dataStrategy.Run.Execute(new UpdateEntityOperation(table.GetQualifiedName(), dict)); } diff --git a/Simple.Data/DataStrategy.cs b/Simple.Data/DataStrategy.cs index b612d2c0..f20318f1 100644 --- a/Simple.Data/DataStrategy.cs +++ b/Simple.Data/DataStrategy.cs @@ -50,7 +50,7 @@ private dynamic GetOrAddDynamicReference(string name) return _members.GetOrAdd(name, CreateDynamicReference); } - internal bool TryInvokeFunction(String functionName, Func> getFunctionArguments, + internal bool TryInvokeFunction(String functionName, Func> getFunctionArguments, out object result) { var adapter = GetAdapter(); diff --git a/Simple.Data/Extensions/EnumerableExtensions.cs b/Simple.Data/Extensions/EnumerableExtensions.cs index da6e17df..c74c4517 100644 --- a/Simple.Data/Extensions/EnumerableExtensions.cs +++ b/Simple.Data/Extensions/EnumerableExtensions.cs @@ -16,7 +16,7 @@ public static IDictionary ToDictionary(this IEnumerabl public static IDictionary ToDictionary(this IEnumerable> source, IEqualityComparer equalityComparer) { var dict = source as IDictionary; - if (dict != null) return new Dictionary(dict); + if (dict != null) return new Dictionary(dict, equalityComparer); return source.ToDictionary(kvp => kvp.Key, kvp => kvp.Value, equalityComparer); } diff --git a/Simple.Data/Extensions/ResultSetExtensions.cs b/Simple.Data/Extensions/ResultSetExtensions.cs index 7c5833b8..68923b97 100644 --- a/Simple.Data/Extensions/ResultSetExtensions.cs +++ b/Simple.Data/Extensions/ResultSetExtensions.cs @@ -8,7 +8,8 @@ internal static class ResultSetExtensions public static SimpleResultSet ResultSetFromModifiedRowCount(this int count) { var simpleResultSet = new SimpleResultSet(Enumerable.Empty()); - simpleResultSet.SetOutputValues(new Dictionary { { "__ReturnValue", count } }); + IDictionary outputValues = new Dictionary { { "__ReturnValue", count } }; + simpleResultSet.SetOutputValues(outputValues); return simpleResultSet; } } diff --git a/Simple.Data/IAdapterWithRelation.cs b/Simple.Data/IAdapterWithRelation.cs index 8bdce726..184b7180 100644 --- a/Simple.Data/IAdapterWithRelation.cs +++ b/Simple.Data/IAdapterWithRelation.cs @@ -23,8 +23,9 @@ public interface IAdapterWithRelation /// Name of the table. /// /// + /// /// The list of records matching the criteria. If no records are found, return an empty list. /// When implementing the interface, if relationships are not possible, throw a . - object FindRelated(string tableName, IDictionary row, string relatedTableName); + object FindRelated(string tableName, IDictionary row, string relatedTableName, DataStrategy database); } } diff --git a/Simple.Data/InMemoryAdapterIAdapterWithRelation.cs b/Simple.Data/InMemoryAdapterIAdapterWithRelation.cs index 188a7761..3026b698 100644 --- a/Simple.Data/InMemoryAdapterIAdapterWithRelation.cs +++ b/Simple.Data/InMemoryAdapterIAdapterWithRelation.cs @@ -18,7 +18,7 @@ public bool IsValidRelation(string tableName, string relatedTableName) _keyComparer.Equals(relatedTableName, ji.DetailPropertyName)); } - public object FindRelated(string tableName, IDictionary row, string relatedTableName) + public object FindRelated(string tableName, IDictionary row, string relatedTableName, DataStrategy database) { return FindMaster(tableName, row, relatedTableName) ?? FindDetail(tableName, row, relatedTableName); } diff --git a/Simple.Data/Operations/GetOperation.cs b/Simple.Data/Operations/GetOperation.cs index 0f85ddcf..42aa61b8 100644 --- a/Simple.Data/Operations/GetOperation.cs +++ b/Simple.Data/Operations/GetOperation.cs @@ -27,19 +27,19 @@ public string TableName public class FunctionOperation : IOperation { private readonly string _functionName; - private readonly IReadOnlyDictionary _parameters; + private readonly IDictionary _parameters; public string FunctionName { get { return _functionName; } } - public IReadOnlyDictionary Parameters + public IDictionary Parameters { get { return _parameters; } } - public FunctionOperation(string functionName, IReadOnlyDictionary parameters) + public FunctionOperation(string functionName, IDictionary parameters) { _functionName = functionName; _parameters = parameters; diff --git a/Simple.Data/SimpleRecord.Dictionary2.cs b/Simple.Data/SimpleRecord.Dictionary2.cs index 7b926bf9..b72d72c8 100644 --- a/Simple.Data/SimpleRecord.Dictionary2.cs +++ b/Simple.Data/SimpleRecord.Dictionary2.cs @@ -5,7 +5,7 @@ namespace Simple.Data { - sealed partial class SimpleRecord : IDictionary + sealed partial class SimpleRecord : IDictionary, IReadOnlyDictionary { IEnumerator> IEnumerable>.GetEnumerator() { @@ -52,6 +52,26 @@ bool IDictionary.ContainsKey(string key) return _data.ContainsKey(key); } + bool IReadOnlyDictionary.TryGetValue(string key, out object value) + { + return _data.TryGetValue(key, out value); + } + + object IReadOnlyDictionary.this[string key] + { + get { return _data[key]; } + } + + IEnumerable IReadOnlyDictionary.Keys + { + get { return _data.Keys.AsEnumerable(); } + } + + IEnumerable IReadOnlyDictionary.Values + { + get { return _data.Values.AsEnumerable(); } + } + void IDictionary.Add(string key, object value) { _data.Add(key, value); @@ -62,6 +82,11 @@ bool IDictionary.Remove(string key) return _data.Remove(key); } + bool IReadOnlyDictionary.ContainsKey(string key) + { + return _data.ContainsKey(key); + } + bool IDictionary.TryGetValue(string key, out object value) { return _data.TryGetValue(key, out value); @@ -87,5 +112,10 @@ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return _data.GetEnumerator(); } + + int IReadOnlyCollection>.Count + { + get { return _data.Count; } + } } } diff --git a/Simple.Data/SimpleRecord.cs b/Simple.Data/SimpleRecord.cs index 8af28aaf..f77eac32 100644 --- a/Simple.Data/SimpleRecord.cs +++ b/Simple.Data/SimpleRecord.cs @@ -84,7 +84,7 @@ public override bool TryGetMember(GetMemberBinder binder, out object result) private object GetRelatedData(GetMemberBinder binder, IAdapterWithRelation relatedAdapter) { object result; - var related = relatedAdapter.FindRelated(_tableName, _data, binder.Name); + var related = relatedAdapter.FindRelated(_tableName, _data, binder.Name, _database); var query = related as SimpleQuery; if (query != null) { diff --git a/Simple.Data/SimpleResultSet.cs b/Simple.Data/SimpleResultSet.cs index 13100c8f..571840dc 100644 --- a/Simple.Data/SimpleResultSet.cs +++ b/Simple.Data/SimpleResultSet.cs @@ -1,318 +1,325 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Dynamic; -using System.Linq; -using System.Linq.Expressions; -using System.Text; - -namespace Simple.Data -{ - public sealed class SimpleResultSet : DynamicObject, IEnumerable - { - public static readonly SimpleResultSet Empty = new SimpleResultSet(); - - private readonly IEnumerable> _sources; - private readonly IEnumerator> _sourceEnumerator; - private bool _hasCurrent; - private IReadOnlyDictionary _outputValues; - - private SimpleResultSet() : this(Enumerable.Empty>()) - { - - } - - public SimpleResultSet(params IEnumerable[] sources) : this (sources.AsEnumerable()) - { - } - - public SimpleResultSet(IEnumerable> sources) - { - _sources = sources; - _sourceEnumerator = _sources.GetEnumerator(); - _hasCurrent = _sourceEnumerator.MoveNext(); - } - - public IReadOnlyDictionary OutputValues - { - get { return _outputValues; } - } - - public object ReturnValue - { - get { return (_outputValues != null && _outputValues.ContainsKey("__ReturnValue")) ? _outputValues["__ReturnValue"] : 0; } - } - - public bool NextResult() - { - return _hasCurrent = (_hasCurrent && _sourceEnumerator.MoveNext()); - } - - public IEnumerable Cast() - { - return new CastEnumerable(_sourceEnumerator.Current); - } - - public IEnumerable OfType() - { - return new OfTypeEnumerable(_sourceEnumerator.Current); - } - - public IList ToList() - { - return _sourceEnumerator.Current.ToList(); - } - - public dynamic[] ToArray() - { - return _sourceEnumerator.Current.ToArray(); - } - - public IList ToList() - { - return Cast().ToList(); - } - - public T[] ToArray() - { - return Cast().ToArray(); - } - - public IList ToScalarList() - { - return ToScalarEnumerable().ToList(); - } - - public dynamic[] ToScalarArray() - { - return ToScalarEnumerable().ToArray(); - } - - public IList ToScalarList() - { - return ToScalarEnumerable().Cast().ToList(); - } - - public T[] ToScalarArray() - { - return ToScalarEnumerable().Cast().ToArray(); - } - - private IEnumerable ToScalarEnumerable() - { - return _sourceEnumerator.Current.OfType>().Select(dict => dict.Values.FirstOrDefault()); - } - - public dynamic First() - { - return _sourceEnumerator.Current.First(); - } - - public dynamic FirstOrDefault() - { - return _sourceEnumerator.Current.FirstOrDefault(); - } - - public T First() - { - return Cast().First(); - } - - public T FirstOrDefault() - { - return Cast().FirstOrDefault(); - } - - public T First(Func predicate) - { - return Cast().First(predicate); - } - - public T FirstOrDefault(Func predicate) - { - return Cast().FirstOrDefault(predicate); - } - - public dynamic Last() - { - return _sourceEnumerator.Current.Last(); - } - - public dynamic LastOrDefault() - { - return _sourceEnumerator.Current.LastOrDefault(); - } - - public T Last() - { - return Cast().Last(); - } - - public T LastOrDefault() - { - return Cast().LastOrDefault(); - } - - public T Last(Func predicate) - { - return Cast().Last(predicate); - } - - public T LastOrDefault(Func predicate) - { - return Cast().LastOrDefault(predicate); - } - - public dynamic Single() - { - return _sourceEnumerator.Current.Single(); - } - - public dynamic SingleOrDefault() - { - return _sourceEnumerator.Current.SingleOrDefault(); - } - - public T Single() - { - return Cast().Single(); - } - - public T SingleOrDefault() - { - return Cast().SingleOrDefault(); - } - - public T Single(Func predicate) - { - return Cast().Single(predicate); - } - - public T SingleOrDefault(Func predicate) - { - return Cast().SingleOrDefault(predicate); - } - - /// - /// Returns an enumerator that iterates through the collection. - /// - /// - /// A that can be used to iterate through the collection. - /// - /// 1 - public IEnumerator GetEnumerator() - { - return new DynamicEnumerator(_sourceEnumerator.Current); - } - - public override bool TryConvert(ConvertBinder binder, out object result) - { - if (binder.Type == typeof(IEnumerable)) - { - result = Cast(); - return true; - } - - if (ConcreteCollectionTypeCreator.IsCollectionType(binder.Type)) - { - if (ConcreteCollectionTypeCreator.TryCreate(binder.Type, this, out result)) - return true; - } - - return base.TryConvert(binder, out result); - } - - class DynamicEnumerator : IEnumerator, IDisposable - { - private readonly IEnumerator _enumerator; - - public DynamicEnumerator(IEnumerable source) - { - _enumerator = source.GetEnumerator(); - } - - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - /// 2 - public void Dispose() - { - _enumerator.Dispose(); - } - - /// - /// Advances the enumerator to the next element of the collection. - /// - /// - /// true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection. - /// - /// The collection was modified after the enumerator was created. 2 - public bool MoveNext() - { - return _enumerator.MoveNext(); - } - - /// - /// Sets the enumerator to its initial position, which is before the first element in the collection. - /// - /// The collection was modified after the enumerator was created. 2 - public void Reset() - { - _enumerator.Reset(); - } - - /// - /// Gets the current element in the collection. - /// - /// - /// The current element in the collection. - /// - /// The enumerator is positioned before the first element of the collection or after the last element.2 - public object Current - { - get { return _enumerator.Current; } - } - } - - /// - /// Creates a single-set from the specified source. - /// - /// The source. - public static SimpleResultSet Create(IEnumerable> source) - { - var q = from dict in source - select new SimpleRecord(dict); - return new SimpleResultSet(q); - } - - /// - /// Creates a single-set from the specified source. - /// - /// The source. - public static SimpleResultSet Create(IEnumerable> source, string tableName, DataStrategy dataStrategy) - { - var q = from dict in source - where dict != null - select new SimpleRecord(dict, tableName, dataStrategy); - return new SimpleResultSet(q); - } - - /// - /// Creates a multi-set from the specified sources. - /// - /// The sources. - /// - public static SimpleResultSet Create(IEnumerable>> sources) - { - var q = from source in sources - select from dict in source - select new SimpleRecord(dict); - return new SimpleResultSet(q); - } - - internal void SetOutputValues(IReadOnlyDictionary outputValues) - { - _outputValues = outputValues; - } - } -} +using System; +using System.Collections; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; + +namespace Simple.Data +{ + using System.Collections.ObjectModel; + + public sealed class SimpleResultSet : DynamicObject, IEnumerable + { + public static readonly SimpleResultSet Empty = new SimpleResultSet(); + + private readonly IEnumerable> _sources; + private readonly IEnumerator> _sourceEnumerator; + private bool _hasCurrent; + private IReadOnlyDictionary _outputValues; + + private SimpleResultSet() : this(Enumerable.Empty>()) + { + + } + + public SimpleResultSet(params IEnumerable[] sources) : this (sources.AsEnumerable()) + { + } + + public SimpleResultSet(IEnumerable> sources) + { + _sources = sources; + _sourceEnumerator = _sources.GetEnumerator(); + _hasCurrent = _sourceEnumerator.MoveNext(); + } + + public IReadOnlyDictionary OutputValues + { + get { return _outputValues; } + } + + public object ReturnValue + { + get { return (_outputValues != null && _outputValues.ContainsKey("__ReturnValue")) ? _outputValues["__ReturnValue"] : 0; } + } + + public bool NextResult() + { + return _hasCurrent = (_hasCurrent && _sourceEnumerator.MoveNext()); + } + + public IEnumerable Cast() + { + return new CastEnumerable(_sourceEnumerator.Current); + } + + public IEnumerable OfType() + { + return new OfTypeEnumerable(_sourceEnumerator.Current); + } + + public IList ToList() + { + return _sourceEnumerator.Current.ToList(); + } + + public dynamic[] ToArray() + { + return _sourceEnumerator.Current.ToArray(); + } + + public IList ToList() + { + return Cast().ToList(); + } + + public T[] ToArray() + { + return Cast().ToArray(); + } + + public IList ToScalarList() + { + return ToScalarEnumerable().ToList(); + } + + public dynamic[] ToScalarArray() + { + return ToScalarEnumerable().ToArray(); + } + + public IList ToScalarList() + { + return ToScalarEnumerable().Cast().ToList(); + } + + public T[] ToScalarArray() + { + return ToScalarEnumerable().Cast().ToArray(); + } + + private IEnumerable ToScalarEnumerable() + { + return _sourceEnumerator.Current.OfType>().Select(dict => dict.Values.FirstOrDefault()); + } + + public dynamic First() + { + return _sourceEnumerator.Current.First(); + } + + public dynamic FirstOrDefault() + { + return _sourceEnumerator.Current.FirstOrDefault(); + } + + public T First() + { + return Cast().First(); + } + + public T FirstOrDefault() + { + return Cast().FirstOrDefault(); + } + + public T First(Func predicate) + { + return Cast().First(predicate); + } + + public T FirstOrDefault(Func predicate) + { + return Cast().FirstOrDefault(predicate); + } + + public dynamic Last() + { + return _sourceEnumerator.Current.Last(); + } + + public dynamic LastOrDefault() + { + return _sourceEnumerator.Current.LastOrDefault(); + } + + public T Last() + { + return Cast().Last(); + } + + public T LastOrDefault() + { + return Cast().LastOrDefault(); + } + + public T Last(Func predicate) + { + return Cast().Last(predicate); + } + + public T LastOrDefault(Func predicate) + { + return Cast().LastOrDefault(predicate); + } + + public dynamic Single() + { + return _sourceEnumerator.Current.Single(); + } + + public dynamic SingleOrDefault() + { + return _sourceEnumerator.Current.SingleOrDefault(); + } + + public T Single() + { + return Cast().Single(); + } + + public T SingleOrDefault() + { + return Cast().SingleOrDefault(); + } + + public T Single(Func predicate) + { + return Cast().Single(predicate); + } + + public T SingleOrDefault(Func predicate) + { + return Cast().SingleOrDefault(predicate); + } + + /// + /// Returns an enumerator that iterates through the collection. + /// + /// + /// A that can be used to iterate through the collection. + /// + /// 1 + public IEnumerator GetEnumerator() + { + return new DynamicEnumerator(_sourceEnumerator.Current); + } + + public override bool TryConvert(ConvertBinder binder, out object result) + { + if (binder.Type == typeof(IEnumerable)) + { + result = Cast(); + return true; + } + + if (ConcreteCollectionTypeCreator.IsCollectionType(binder.Type)) + { + if (ConcreteCollectionTypeCreator.TryCreate(binder.Type, this, out result)) + return true; + } + + return base.TryConvert(binder, out result); + } + + class DynamicEnumerator : IEnumerator, IDisposable + { + private readonly IEnumerator _enumerator; + + public DynamicEnumerator(IEnumerable source) + { + _enumerator = source.GetEnumerator(); + } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + /// 2 + public void Dispose() + { + _enumerator.Dispose(); + } + + /// + /// Advances the enumerator to the next element of the collection. + /// + /// + /// true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection. + /// + /// The collection was modified after the enumerator was created. 2 + public bool MoveNext() + { + return _enumerator.MoveNext(); + } + + /// + /// Sets the enumerator to its initial position, which is before the first element in the collection. + /// + /// The collection was modified after the enumerator was created. 2 + public void Reset() + { + _enumerator.Reset(); + } + + /// + /// Gets the current element in the collection. + /// + /// + /// The current element in the collection. + /// + /// The enumerator is positioned before the first element of the collection or after the last element.2 + public object Current + { + get { return _enumerator.Current; } + } + } + + /// + /// Creates a single-set from the specified source. + /// + /// The source. + public static SimpleResultSet Create(IEnumerable> source) + { + var q = from dict in source + select new SimpleRecord(dict); + return new SimpleResultSet(q); + } + + /// + /// Creates a single-set from the specified source. + /// + /// The source. + public static SimpleResultSet Create(IEnumerable> source, string tableName, DataStrategy dataStrategy) + { + var q = from dict in source + where dict != null + select new SimpleRecord(dict, tableName, dataStrategy); + return new SimpleResultSet(q); + } + + /// + /// Creates a multi-set from the specified sources. + /// + /// The sources. + /// + public static SimpleResultSet Create(IEnumerable>> sources) + { + var q = from source in sources + select from dict in source + select new SimpleRecord(dict); + return new SimpleResultSet(q); + } + + internal void SetOutputValues(IReadOnlyDictionary outputValues) + { + _outputValues = outputValues; + } + + internal void SetOutputValues(IDictionary outputValues) + { + _outputValues = new ReadOnlyDictionary(outputValues); + } + } +} diff --git a/packages/NUnit.2.6.2/NUnit.2.6.2.nuspec b/packages/NUnit.2.6.2/NUnit.2.6.2.nuspec new file mode 100644 index 00000000..57ddc87b --- /dev/null +++ b/packages/NUnit.2.6.2/NUnit.2.6.2.nuspec @@ -0,0 +1,27 @@ + + + + NUnit + 2.6.2 + NUnit + Charlie Poole + Charlie Poole + http://nunit.org/nuget/license.html + http://nunit.org/ + http://nunit.org/nuget/nunit_32x32.png + false + NUnit features a fluent assert syntax, parameterized, generic and theory tests and is user-extensible. A number of runners, both from the NUnit project and by third parties, are able to execute NUnit tests. + +Version 2.6 is the seventh major release of this well-known and well-tested programming tool. + +This package includes only the framework assembly. You will need to install the NUnit.Runners package unless you are using a third-party runner. + NUnit is a unit-testing framework for all .Net languages with a strong TDD focus. + Version 2.6 is the seventh major release of NUnit. + +Unlike earlier versions, this package includes only the framework assembly. You will need to install the NUnit.Runners package unless you are using a third-party runner. + +The nunit.mocks assembly is now provided by the NUnit.Mocks package. The pnunit.framework assembly is provided by the pNUnit package. + en-US + test testing tdd framework fluent assert theory plugin addin + + \ No newline at end of file diff --git a/packages/NUnit.2.6.2/lib/nunit.framework.xml b/packages/NUnit.2.6.2/lib/nunit.framework.xml new file mode 100644 index 00000000..7702ceeb --- /dev/null +++ b/packages/NUnit.2.6.2/lib/nunit.framework.xml @@ -0,0 +1,10899 @@ + + + + nunit.framework + + + + + Attribute used to apply a category to a test + + + + + The name of the category + + + + + Construct attribute for a given category based on + a name. The name may not contain the characters ',', + '+', '-' or '!'. However, this is not checked in the + constructor since it would cause an error to arise at + as the test was loaded without giving a clear indication + of where the problem is located. The error is handled + in NUnitFramework.cs by marking the test as not + runnable. + + The name of the category + + + + Protected constructor uses the Type name as the name + of the category. + + + + + The name of the category + + + + + Used to mark a field for use as a datapoint when executing a theory + within the same fixture that requires an argument of the field's Type. + + + + + Used to mark an array as containing a set of datapoints to be used + executing a theory within the same fixture that requires an argument + of the Type of the array elements. + + + + + Attribute used to provide descriptive text about a + test case or fixture. + + + + + Construct the attribute + + Text describing the test + + + + Gets the test description + + + + + Enumeration indicating how the expected message parameter is to be used + + + + Expect an exact match + + + Expect a message containing the parameter string + + + Match the regular expression provided as a parameter + + + Expect a message that starts with the parameter string + + + + ExpectedExceptionAttribute + + + + + + Constructor for a non-specific exception + + + + + Constructor for a given type of exception + + The type of the expected exception + + + + Constructor for a given exception name + + The full name of the expected exception + + + + Gets or sets the expected exception type + + + + + Gets or sets the full Type name of the expected exception + + + + + Gets or sets the expected message text + + + + + Gets or sets the user message displayed in case of failure + + + + + Gets or sets the type of match to be performed on the expected message + + + + + Gets the name of a method to be used as an exception handler + + + + + ExplicitAttribute marks a test or test fixture so that it will + only be run if explicitly executed from the gui or command line + or if it is included by use of a filter. The test will not be + run simply because an enclosing suite is run. + + + + + Default constructor + + + + + Constructor with a reason + + The reason test is marked explicit + + + + The reason test is marked explicit + + + + + Attribute used to mark a test that is to be ignored. + Ignored tests result in a warning message when the + tests are run. + + + + + Constructs the attribute without giving a reason + for ignoring the test. + + + + + Constructs the attribute giving a reason for ignoring the test + + The reason for ignoring the test + + + + The reason for ignoring a test + + + + + Abstract base for Attributes that are used to include tests + in the test run based on environmental settings. + + + + + Constructor with no included items specified, for use + with named property syntax. + + + + + Constructor taking one or more included items + + Comma-delimited list of included items + + + + Name of the item that is needed in order for + a test to run. Multiple itemss may be given, + separated by a comma. + + + + + Name of the item to be excluded. Multiple items + may be given, separated by a comma. + + + + + The reason for including or excluding the test + + + + + PlatformAttribute is used to mark a test fixture or an + individual method as applying to a particular platform only. + + + + + Constructor with no platforms specified, for use + with named property syntax. + + + + + Constructor taking one or more platforms + + Comma-deliminted list of platforms + + + + CultureAttribute is used to mark a test fixture or an + individual method as applying to a particular Culture only. + + + + + Constructor with no cultures specified, for use + with named property syntax. + + + + + Constructor taking one or more cultures + + Comma-deliminted list of cultures + + + + Marks a test to use a combinatorial join of any argument data + provided. NUnit will create a test case for every combination of + the arguments provided. This can result in a large number of test + cases and so should be used judiciously. This is the default join + type, so the attribute need not be used except as documentation. + + + + + PropertyAttribute is used to attach information to a test as a name/value pair.. + + + + + Construct a PropertyAttribute with a name and string value + + The name of the property + The property value + + + + Construct a PropertyAttribute with a name and int value + + The name of the property + The property value + + + + Construct a PropertyAttribute with a name and double value + + The name of the property + The property value + + + + Constructor for derived classes that set the + property dictionary directly. + + + + + Constructor for use by derived classes that use the + name of the type as the property name. Derived classes + must ensure that the Type of the property value is + a standard type supported by the BCL. Any custom + types will cause a serialization Exception when + in the client. + + + + + Gets the property dictionary for this attribute + + + + + Default constructor + + + + + Marks a test to use pairwise join of any argument data provided. + NUnit will attempt too excercise every pair of argument values at + least once, using as small a number of test cases as it can. With + only two arguments, this is the same as a combinatorial join. + + + + + Default constructor + + + + + Marks a test to use a sequential join of any argument data + provided. NUnit will use arguements for each parameter in + sequence, generating test cases up to the largest number + of argument values provided and using null for any arguments + for which it runs out of values. Normally, this should be + used with the same number of arguments for each parameter. + + + + + Default constructor + + + + + Summary description for MaxTimeAttribute. + + + + + Construct a MaxTimeAttribute, given a time in milliseconds. + + The maximum elapsed time in milliseconds + + + + RandomAttribute is used to supply a set of random values + to a single parameter of a parameterized test. + + + + + ValuesAttribute is used to provide literal arguments for + an individual parameter of a test. + + + + + Abstract base class for attributes that apply to parameters + and supply data for the parameter. + + + + + Gets the data to be provided to the specified parameter + + + + + The collection of data to be returned. Must + be set by any derived attribute classes. + We use an object[] so that the individual + elements may have their type changed in GetData + if necessary. + + + + + Construct with one argument + + + + + + Construct with two arguments + + + + + + + Construct with three arguments + + + + + + + + Construct with an array of arguments + + + + + + Get the collection of values to be used as arguments + + + + + Construct a set of doubles from 0.0 to 1.0, + specifying only the count. + + + + + + Construct a set of doubles from min to max + + + + + + + + Construct a set of ints from min to max + + + + + + + + Get the collection of values to be used as arguments + + + + + RangeAttribute is used to supply a range of values to an + individual parameter of a parameterized test. + + + + + Construct a range of ints using default step of 1 + + + + + + + Construct a range of ints specifying the step size + + + + + + + + Construct a range of longs + + + + + + + + Construct a range of doubles + + + + + + + + Construct a range of floats + + + + + + + + RepeatAttribute may be applied to test case in order + to run it multiple times. + + + + + Construct a RepeatAttribute + + The number of times to run the test + + + + RequiredAddinAttribute may be used to indicate the names of any addins + that must be present in order to run some or all of the tests in an + assembly. If the addin is not loaded, the entire assembly is marked + as NotRunnable. + + + + + Initializes a new instance of the class. + + The required addin. + + + + Gets the name of required addin. + + The required addin name. + + + + Summary description for SetCultureAttribute. + + + + + Construct given the name of a culture + + + + + + Summary description for SetUICultureAttribute. + + + + + Construct given the name of a culture + + + + + + SetUpAttribute is used in a TestFixture to identify a method + that is called immediately before each test is run. It is + also used in a SetUpFixture to identify the method that is + called once, before any of the subordinate tests are run. + + + + + Attribute used to mark a class that contains one-time SetUp + and/or TearDown methods that apply to all the tests in a + namespace or an assembly. + + + + + Attribute used to mark a static (shared in VB) property + that returns a list of tests. + + + + + Attribute used in a TestFixture to identify a method that is + called immediately after each test is run. It is also used + in a SetUpFixture to identify the method that is called once, + after all subordinate tests have run. In either case, the method + is guaranteed to be called, even if an exception is thrown. + + + + + Provide actions to execute before and after tests. + + + + + When implemented by an attribute, this interface implemented to provide actions to execute before and after tests. + + + + + Executed before each test is run + + Provides details about the test that is going to be run. + + + + Executed after each test is run + + Provides details about the test that has just been run. + + + + Provides the target for the action attribute + + The target for the action attribute + + + + Adding this attribute to a method within a + class makes the method callable from the NUnit test runner. There is a property + called Description which is optional which you can provide a more detailed test + description. This class cannot be inherited. + + + + [TestFixture] + public class Fixture + { + [Test] + public void MethodToTest() + {} + + [Test(Description = "more detailed description")] + publc void TestDescriptionMethod() + {} + } + + + + + + Descriptive text for this test + + + + + TestCaseAttribute is used to mark parameterized test cases + and provide them with their arguments. + + + + + The ITestCaseData interface is implemented by a class + that is able to return complete testcases for use by + a parameterized test method. + + NOTE: This interface is used in both the framework + and the core, even though that results in two different + types. However, sharing the source code guarantees that + the various implementations will be compatible and that + the core is able to reflect successfully over the + framework implementations of ITestCaseData. + + + + + Gets the argument list to be provided to the test + + + + + Gets the expected result + + + + + Indicates whether a result has been specified. + This is necessary because the result may be + null, so it's value cannot be checked. + + + + + Gets the expected exception Type + + + + + Gets the FullName of the expected exception + + + + + Gets the name to be used for the test + + + + + Gets the description of the test + + + + + Gets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets a value indicating whether this is explicit. + + true if explicit; otherwise, false. + + + + Gets the ignore reason. + + The ignore reason. + + + + Construct a TestCaseAttribute with a list of arguments. + This constructor is not CLS-Compliant + + + + + + Construct a TestCaseAttribute with a single argument + + + + + + Construct a TestCaseAttribute with a two arguments + + + + + + + Construct a TestCaseAttribute with a three arguments + + + + + + + + Gets the list of arguments to a test case + + + + + Gets or sets the expected result. Use + ExpectedResult by preference. + + The result. + + + + Gets or sets the expected result. + + The result. + + + + Gets a flag indicating whether an expected + result has been set. + + + + + Gets a list of categories associated with this test; + + + + + Gets or sets the category associated with this test. + May be a single category or a comma-separated list. + + + + + Gets or sets the expected exception. + + The expected exception. + + + + Gets or sets the name the expected exception. + + The expected name of the exception. + + + + Gets or sets the expected message of the expected exception + + The expected message of the exception. + + + + Gets or sets the type of match to be performed on the expected message + + + + + Gets or sets the description. + + The description. + + + + Gets or sets the name of the test. + + The name of the test. + + + + Gets or sets the ignored status of the test + + + + + Gets or sets the ignored status of the test + + + + + Gets or sets the explicit status of the test + + + + + Gets or sets the reason for not running the test + + + + + Gets or sets the reason for not running the test. + Set has the side effect of marking the test as ignored. + + The ignore reason. + + + + FactoryAttribute indicates the source to be used to + provide test cases for a test method. + + + + + Construct with the name of the data source, which must + be a property, field or method of the test class itself. + + An array of the names of the factories that will provide data + + + + Construct with a Type, which must implement IEnumerable + + The Type that will provide data + + + + Construct with a Type and name. + that don't support params arrays. + + The Type that will provide data + The name of the method, property or field that will provide data + + + + The name of a the method, property or fiend to be used as a source + + + + + A Type to be used as a source + + + + + Gets or sets the category associated with this test. + May be a single category or a comma-separated list. + + + + + [TestFixture] + public class ExampleClass + {} + + + + + Default constructor + + + + + Construct with a object[] representing a set of arguments. + In .NET 2.0, the arguments may later be separated into + type arguments and constructor arguments. + + + + + + Descriptive text for this fixture + + + + + Gets and sets the category for this fixture. + May be a comma-separated list of categories. + + + + + Gets a list of categories for this fixture + + + + + The arguments originally provided to the attribute + + + + + Gets or sets a value indicating whether this should be ignored. + + true if ignore; otherwise, false. + + + + Gets or sets the ignore reason. May set Ignored as a side effect. + + The ignore reason. + + + + Get or set the type arguments. If not set + explicitly, any leading arguments that are + Types are taken as type arguments. + + + + + Attribute used to identify a method that is + called before any tests in a fixture are run. + + + + + Attribute used to identify a method that is called after + all the tests in a fixture have run. The method is + guaranteed to be called, even if an exception is thrown. + + + + + Adding this attribute to a method within a + class makes the method callable from the NUnit test runner. There is a property + called Description which is optional which you can provide a more detailed test + description. This class cannot be inherited. + + + + [TestFixture] + public class Fixture + { + [Test] + public void MethodToTest() + {} + + [Test(Description = "more detailed description")] + publc void TestDescriptionMethod() + {} + } + + + + + + Used on a method, marks the test with a timeout value in milliseconds. + The test will be run in a separate thread and is cancelled if the timeout + is exceeded. Used on a method or assembly, sets the default timeout + for all contained test methods. + + + + + Construct a TimeoutAttribute given a time in milliseconds + + The timeout value in milliseconds + + + + Marks a test that must run in the STA, causing it + to run in a separate thread if necessary. + + On methods, you may also use STAThreadAttribute + to serve the same purpose. + + + + + Construct a RequiresSTAAttribute + + + + + Marks a test that must run in the MTA, causing it + to run in a separate thread if necessary. + + On methods, you may also use MTAThreadAttribute + to serve the same purpose. + + + + + Construct a RequiresMTAAttribute + + + + + Marks a test that must run on a separate thread. + + + + + Construct a RequiresThreadAttribute + + + + + Construct a RequiresThreadAttribute, specifying the apartment + + + + + ValueSourceAttribute indicates the source to be used to + provide data for one parameter of a test method. + + + + + Construct with the name of the factory - for use with languages + that don't support params arrays. + + The name of the data source to be used + + + + Construct with a Type and name - for use with languages + that don't support params arrays. + + The Type that will provide data + The name of the method, property or field that will provide data + + + + The name of a the method, property or fiend to be used as a source + + + + + A Type to be used as a source + + + + + AttributeExistsConstraint tests for the presence of a + specified attribute on a Type. + + + + + The Constraint class is the base of all built-in constraints + within NUnit. It provides the operator overloads used to combine + constraints. + + + + + The IConstraintExpression interface is implemented by all + complete and resolvable constraints and expressions. + + + + + Return the top-level constraint for this expression + + + + + + Static UnsetObject used to detect derived constraints + failing to set the actual value. + + + + + The actual value being tested against a constraint + + + + + The display name of this Constraint for use by ToString() + + + + + Argument fields used by ToString(); + + + + + The builder holding this constraint + + + + + Construct a constraint with no arguments + + + + + Construct a constraint with one argument + + + + + Construct a constraint with two arguments + + + + + Sets the ConstraintBuilder holding this constraint + + + + + Write the failure message to the MessageWriter provided + as an argument. The default implementation simply passes + the constraint and the actual value to the writer, which + then displays the constraint description and the value. + + Constraints that need to provide additional details, + such as where the error occured can override this. + + The MessageWriter on which to display the message + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Test whether the constraint is satisfied by an + ActualValueDelegate that returns the value to be tested. + The default implementation simply evaluates the delegate + but derived classes may override it to provide for delayed + processing. + + An ActualValueDelegate + True for success, false for failure + + + + Test whether the constraint is satisfied by a given reference. + The default implementation simply dereferences the value but + derived classes may override it to provide for delayed processing. + + A reference to the value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + Default override of ToString returns the constraint DisplayName + followed by any arguments within angle brackets. + + + + + + Returns the string representation of this constraint + + + + + This operator creates a constraint that is satisfied only if both + argument constraints are satisfied. + + + + + This operator creates a constraint that is satisfied if either + of the argument constraints is satisfied. + + + + + This operator creates a constraint that is satisfied if the + argument constraint is not satisfied. + + + + + Returns a DelayedConstraint with the specified delay time. + + The delay in milliseconds. + + + + + Returns a DelayedConstraint with the specified delay time + and polling interval. + + The delay in milliseconds. + The interval at which to test the constraint. + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + Returns a ConstraintExpression by appending And + to the current constraint. + + + + + Returns a ConstraintExpression by appending And + to the current constraint. + + + + + Returns a ConstraintExpression by appending Or + to the current constraint. + + + + + Class used to detect any derived constraints + that fail to set the actual value in their + Matches override. + + + + + Constructs an AttributeExistsConstraint for a specific attribute Type + + + + + + Tests whether the object provides the expected attribute. + + A Type, MethodInfo, or other ICustomAttributeProvider + True if the expected attribute is present, otherwise false + + + + Writes the description of the constraint to the specified writer + + + + + AttributeConstraint tests that a specified attribute is present + on a Type or other provider and that the value of the attribute + satisfies some other constraint. + + + + + Abstract base class used for prefixes + + + + + The base constraint + + + + + Construct given a base constraint + + + + + + Constructs an AttributeConstraint for a specified attriute + Type and base constraint. + + + + + + + Determines whether the Type or other provider has the + expected attribute and if its value matches the + additional constraint specified. + + + + + Writes a description of the attribute to the specified writer. + + + + + Writes the actual value supplied to the specified writer. + + + + + Returns a string representation of the constraint. + + + + + BasicConstraint is the abstract base for constraints that + perform a simple comparison to a constant value. + + + + + Initializes a new instance of the class. + + The expected. + The description. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + NullConstraint tests that the actual value is null + + + + + Initializes a new instance of the class. + + + + + TrueConstraint tests that the actual value is true + + + + + Initializes a new instance of the class. + + + + + FalseConstraint tests that the actual value is false + + + + + Initializes a new instance of the class. + + + + + NaNConstraint tests that the actual value is a double or float NaN + + + + + Test that the actual value is an NaN + + + + + + + Write the constraint description to a specified writer + + + + + + BinaryConstraint is the abstract base of all constraints + that combine two other constraints in some fashion. + + + + + The first constraint being combined + + + + + The second constraint being combined + + + + + Construct a BinaryConstraint from two other constraints + + The first constraint + The second constraint + + + + AndConstraint succeeds only if both members succeed. + + + + + Create an AndConstraint from two other constraints + + The first constraint + The second constraint + + + + Apply both member constraints to an actual value, succeeding + succeeding only if both of them succeed. + + The actual value + True if the constraints both succeeded + + + + Write a description for this contraint to a MessageWriter + + The MessageWriter to receive the description + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + OrConstraint succeeds if either member succeeds + + + + + Create an OrConstraint from two other constraints + + The first constraint + The second constraint + + + + Apply the member constraints to an actual value, succeeding + succeeding as soon as one of them succeeds. + + The actual value + True if either constraint succeeded + + + + Write a description for this contraint to a MessageWriter + + The MessageWriter to receive the description + + + + CollectionConstraint is the abstract base class for + constraints that operate on collections. + + + + + Construct an empty CollectionConstraint + + + + + Construct a CollectionConstraint + + + + + + Determines whether the specified enumerable is empty. + + The enumerable. + + true if the specified enumerable is empty; otherwise, false. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Protected method to be implemented by derived classes + + + + + + + CollectionItemsEqualConstraint is the abstract base class for all + collection constraints that apply some notion of item equality + as a part of their operation. + + + + + Construct an empty CollectionConstraint + + + + + Construct a CollectionConstraint + + + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied Comparison object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Compares two collection members for equality + + + + + Return a new CollectionTally for use in making tests + + The collection to be included in the tally + + + + Flag the constraint to ignore case and return self. + + + + + EmptyCollectionConstraint tests whether a collection is empty. + + + + + Check that the collection is empty + + + + + + + Write the constraint description to a MessageWriter + + + + + + UniqueItemsConstraint tests whether all the items in a + collection are unique. + + + + + Check that all items are unique. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + CollectionContainsConstraint is used to test whether a collection + contains an expected object as a member. + + + + + Construct a CollectionContainsConstraint + + + + + + Test whether the expected item is contained in the collection + + + + + + + Write a descripton of the constraint to a MessageWriter + + + + + + CollectionEquivalentCOnstraint is used to determine whether two + collections are equivalent. + + + + + Construct a CollectionEquivalentConstraint + + + + + + Test whether two collections are equivalent + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + CollectionSubsetConstraint is used to determine whether + one collection is a subset of another + + + + + Construct a CollectionSubsetConstraint + + The collection that the actual value is expected to be a subset of + + + + Test whether the actual collection is a subset of + the expected collection provided. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + CollectionOrderedConstraint is used to test whether a collection is ordered. + + + + + Construct a CollectionOrderedConstraint + + + + + Modifies the constraint to use an IComparer and returns self. + + + + + Modifies the constraint to use an IComparer<T> and returns self. + + + + + Modifies the constraint to use a Comparison<T> and returns self. + + + + + Modifies the constraint to test ordering by the value of + a specified property and returns self. + + + + + Test whether the collection is ordered + + + + + + + Write a description of the constraint to a MessageWriter + + + + + + Returns the string representation of the constraint. + + + + + + If used performs a reverse comparison + + + + + CollectionTally counts (tallies) the number of + occurences of each object in one or more enumerations. + + + + + Construct a CollectionTally object from a comparer and a collection + + + + + Try to remove an object from the tally + + The object to remove + True if successful, false if the object was not found + + + + Try to remove a set of objects from the tally + + The objects to remove + True if successful, false if any object was not found + + + + The number of objects remaining in the tally + + + + + ComparisonAdapter class centralizes all comparisons of + values in NUnit, adapting to the use of any provided + IComparer, IComparer<T> or Comparison<T> + + + + + Returns a ComparisonAdapter that wraps an IComparer + + + + + Returns a ComparisonAdapter that wraps an IComparer<T> + + + + + Returns a ComparisonAdapter that wraps a Comparison<T> + + + + + Compares two objects + + + + + Gets the default ComparisonAdapter, which wraps an + NUnitComparer object. + + + + + Construct a ComparisonAdapter for an IComparer + + + + + Compares two objects + + + + + + + + Construct a default ComparisonAdapter + + + + + ComparisonAdapter<T> extends ComparisonAdapter and + allows use of an IComparer<T> or Comparison<T> + to actually perform the comparison. + + + + + Construct a ComparisonAdapter for an IComparer<T> + + + + + Compare a Type T to an object + + + + + Construct a ComparisonAdapter for a Comparison<T> + + + + + Compare a Type T to an object + + + + + Abstract base class for constraints that compare values to + determine if one is greater than, equal to or less than + the other. This class supplies the Using modifiers. + + + + + ComparisonAdapter to be used in making the comparison + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Modifies the constraint to use an IComparer and returns self + + + + + Modifies the constraint to use an IComparer<T> and returns self + + + + + Modifies the constraint to use a Comparison<T> and returns self + + + + + Delegate used to delay evaluation of the actual value + to be used in evaluating a constraint + + + + + ConstraintBuilder maintains the stacks that are used in + processing a ConstraintExpression. An OperatorStack + is used to hold operators that are waiting for their + operands to be reognized. a ConstraintStack holds + input constraints as well as the results of each + operator applied. + + + + + Initializes a new instance of the class. + + + + + Appends the specified operator to the expression by first + reducing the operator stack and then pushing the new + operator on the stack. + + The operator to push. + + + + Appends the specified constraint to the expresson by pushing + it on the constraint stack. + + The constraint to push. + + + + Sets the top operator right context. + + The right context. + + + + Reduces the operator stack until the topmost item + precedence is greater than or equal to the target precedence. + + The target precedence. + + + + Resolves this instance, returning a Constraint. If the builder + is not currently in a resolvable state, an exception is thrown. + + The resolved constraint + + + + Gets a value indicating whether this instance is resolvable. + + + true if this instance is resolvable; otherwise, false. + + + + + OperatorStack is a type-safe stack for holding ConstraintOperators + + + + + Initializes a new instance of the class. + + The builder. + + + + Pushes the specified operator onto the stack. + + The op. + + + + Pops the topmost operator from the stack. + + + + + + Gets a value indicating whether this is empty. + + true if empty; otherwise, false. + + + + Gets the topmost operator without modifying the stack. + + The top. + + + + ConstraintStack is a type-safe stack for holding Constraints + + + + + Initializes a new instance of the class. + + The builder. + + + + Pushes the specified constraint. As a side effect, + the constraint's builder field is set to the + ConstraintBuilder owning this stack. + + The constraint. + + + + Pops this topmost constrait from the stack. + As a side effect, the constraint's builder + field is set to null. + + + + + + Gets a value indicating whether this is empty. + + true if empty; otherwise, false. + + + + Gets the topmost constraint without modifying the stack. + + The topmost constraint + + + + ConstraintExpression represents a compound constraint in the + process of being constructed from a series of syntactic elements. + + Individual elements are appended to the expression as they are + reognized. Once an actual Constraint is appended, the expression + returns a resolvable Constraint. + + + + + ConstraintExpressionBase is the abstract base class for the + ConstraintExpression class, which represents a + compound constraint in the process of being constructed + from a series of syntactic elements. + + NOTE: ConstraintExpressionBase is separate because the + ConstraintExpression class was generated in earlier + versions of NUnit. The two classes may be combined + in a future version. + + + + + The ConstraintBuilder holding the elements recognized so far + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the + class passing in a ConstraintBuilder, which may be pre-populated. + + The builder. + + + + Returns a string representation of the expression as it + currently stands. This should only be used for testing, + since it has the side-effect of resolving the expression. + + + + + + Appends an operator to the expression and returns the + resulting expression itself. + + + + + Appends a self-resolving operator to the expression and + returns a new ResolvableConstraintExpression. + + + + + Appends a constraint to the expression and returns that + constraint, which is associated with the current state + of the expression being built. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the + class passing in a ConstraintBuilder, which may be pre-populated. + + The builder. + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. + + + + + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns the constraint provided as an argument - used to allow custom + custom constraints to easily participate in the syntax. + + + + + Returns the constraint provided as an argument - used to allow custom + custom constraints to easily participate in the syntax. + + + + + Returns a constraint that tests two items for equality + + + + + Returns a constraint that tests that two references are the same object + + + + + Returns a constraint that tests whether the + actual value is greater than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the Regex pattern supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the Regex pattern supplied as an argument. + + + + + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the actual value falls + within a specified range. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. + + + + + With is currently a NOP - reserved for future use. + + + + + Returns a constraint that tests for null + + + + + Returns a constraint that tests for True + + + + + Returns a constraint that tests for False + + + + + Returns a constraint that tests for a positive value + + + + + Returns a constraint that tests for a negative value + + + + + Returns a constraint that tests for NaN + + + + + Returns a constraint that tests for empty + + + + + Returns a constraint that tests whether a collection + contains all unique items. + + + + + Returns a constraint that tests whether an object graph is serializable in binary format. + + + + + Returns a constraint that tests whether an object graph is serializable in xml format. + + + + + Returns a constraint that tests whether a collection is ordered + + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. + + + + + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a constraint that tests two items for equality + + + + + Returns a constraint that tests that two references are the same object + + + + + Returns a constraint that tests whether the + actual value is greater than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the Regex pattern supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the Regex pattern supplied as an argument. + + + + + Returns a constraint that fails if the actual + value matches the pattern supplied as an argument. + + + + + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the actual value falls + within a specified range. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. + + + + + Returns a constraint that tests for null + + + + + Returns a constraint that tests for True + + + + + Returns a constraint that tests for False + + + + + Returns a constraint that tests for a positive value + + + + + Returns a constraint that tests for a negative value + + + + + Returns a constraint that tests for NaN + + + + + Returns a constraint that tests for empty + + + + + Returns a constraint that tests whether a collection + contains all unique items. + + + + + Returns a constraint that tests whether an object graph is serializable in binary format. + + + + + Returns a constraint that tests whether an object graph is serializable in xml format. + + + + + Returns a constraint that tests whether a collection is ordered + + + + + The ConstraintOperator class is used internally by a + ConstraintBuilder to represent an operator that + modifies or combines constraints. + + Constraint operators use left and right precedence + values to determine whether the top operator on the + stack should be reduced before pushing a new operator. + + + + + The precedence value used when the operator + is about to be pushed to the stack. + + + + + The precedence value used when the operator + is on the top of the stack. + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + The syntax element preceding this operator + + + + + The syntax element folowing this operator + + + + + The precedence value used when the operator + is about to be pushed to the stack. + + + + + The precedence value used when the operator + is on the top of the stack. + + + + + PrefixOperator takes a single constraint and modifies + it's action in some way. + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Returns the constraint created by applying this + prefix to another constraint. + + + + + + + Negates the test of the constraint it wraps. + + + + + Constructs a new NotOperator + + + + + Returns a NotConstraint applied to its argument. + + + + + Abstract base for operators that indicate how to + apply a constraint to items in a collection. + + + + + Constructs a CollectionOperator + + + + + Represents a constraint that succeeds if all the + members of a collection match a base constraint. + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + they all succeed. + + + + + Represents a constraint that succeeds if any of the + members of a collection match a base constraint. + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + any of them succeed. + + + + + Represents a constraint that succeeds if none of the + members of a collection match a base constraint. + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + none of them succeed. + + + + + Represents a constraint that succeeds if the specified + count of members of a collection match a base constraint. + + + + + Construct an ExactCountOperator for a specified count + + The expected count + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + none of them succeed. + + + + + Represents a constraint that simply wraps the + constraint provided as an argument, without any + further functionality, but which modifes the + order of evaluation because of its precedence. + + + + + Constructor for the WithOperator + + + + + Returns a constraint that wraps its argument + + + + + Abstract base class for operators that are able to reduce to a + constraint whether or not another syntactic element follows. + + + + + Operator used to test for the presence of a named Property + on an object and optionally apply further tests to the + value of that property. + + + + + Constructs a PropOperator for a particular named property + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Gets the name of the property to which the operator applies + + + + + Operator that tests for the presence of a particular attribute + on a type and optionally applies further tests to the attribute. + + + + + Construct an AttributeOperator for a particular Type + + The Type of attribute tested + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + Operator that tests that an exception is thrown and + optionally applies further tests to the exception. + + + + + Construct a ThrowsOperator + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + Abstract base class for all binary operators + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Abstract method that produces a constraint by applying + the operator to its left and right constraint arguments. + + + + + Gets the left precedence of the operator + + + + + Gets the right precedence of the operator + + + + + Operator that requires both it's arguments to succeed + + + + + Construct an AndOperator + + + + + Apply the operator to produce an AndConstraint + + + + + Operator that requires at least one of it's arguments to succeed + + + + + Construct an OrOperator + + + + + Apply the operator to produce an OrConstraint + + + + + ContainsConstraint tests a whether a string contains a substring + or a collection contains an object. It postpones the decision of + which test to use until the type of the actual argument is known. + This allows testing whether a string is contained in a collection + or as a substring of another string using the same syntax. + + + + + Initializes a new instance of the class. + + The expected. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied Comparison object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to ignore case and return self. + + + + + Applies a delay to the match so that a match can be evaluated in the future. + + + + + Creates a new DelayedConstraint + + The inner constraint two decorate + The time interval after which the match is performed + If the value of is less than 0 + + + + Creates a new DelayedConstraint + + The inner constraint two decorate + The time interval after which the match is performed + The time interval used for polling + If the value of is less than 0 + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for if the base constraint fails, false if it succeeds + + + + Test whether the constraint is satisfied by a delegate + + The delegate whose value is to be tested + True for if the base constraint fails, false if it succeeds + + + + Test whether the constraint is satisfied by a given reference. + Overridden to wait for the specified delay period before + calling the base constraint with the dereferenced value. + + A reference to the value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a MessageWriter. + + The writer on which the actual value is displayed + + + + Returns the string representation of the constraint. + + + + + EmptyDirectoryConstraint is used to test that a directory is empty + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + EmptyConstraint tests a whether a string or collection is empty, + postponing the decision about which test is applied until the + type of the actual argument is known. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + EqualConstraint is able to compare an actual value with the + expected value provided in its constructor. Two objects are + considered equal if both are null, or if both have the same + value. NUnit has special semantics for some object types. + + + + + If true, strings in error messages will be clipped + + + + + NUnitEqualityComparer used to test equality. + + + + + Initializes a new instance of the class. + + The expected value. + + + + Flag the constraint to use a tolerance when determining equality. + + Tolerance value to be used + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied Comparison object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write a failure message. Overridden to provide custom + failure messages for EqualConstraint. + + The MessageWriter to write to + + + + Write description of this constraint + + The MessageWriter to write to + + + + Display the failure information for two collections that did not match. + + The MessageWriter on which to display + The expected collection. + The actual collection + The depth of this failure in a set of nested collections + + + + Displays a single line showing the types and sizes of the expected + and actual enumerations, collections or arrays. If both are identical, + the value is only shown once. + + The MessageWriter on which to display + The expected collection or array + The actual collection or array + The indentation level for the message line + + + + Displays a single line showing the point in the expected and actual + arrays at which the comparison failed. If the arrays have different + structures or dimensions, both values are shown. + + The MessageWriter on which to display + The expected array + The actual array + Index of the failure point in the underlying collections + The indentation level for the message line + + + + Display the failure information for two IEnumerables that did not match. + + The MessageWriter on which to display + The expected enumeration. + The actual enumeration + The depth of this failure in a set of nested collections + + + + Flag the constraint to ignore case and return self. + + + + + Flag the constraint to suppress string clipping + and return self. + + + + + Flag the constraint to compare arrays as collections + and return self. + + + + + Switches the .Within() modifier to interpret its tolerance as + a distance in representable values (see remarks). + + Self. + + Ulp stands for "unit in the last place" and describes the minimum + amount a given value can change. For any integers, an ulp is 1 whole + digit. For floating point values, the accuracy of which is better + for smaller numbers and worse for larger numbers, an ulp depends + on the size of the number. Using ulps for comparison of floating + point results instead of fixed tolerances is safer because it will + automatically compensate for the added inaccuracy of larger numbers. + + + + + Switches the .Within() modifier to interpret its tolerance as + a percentage that the actual values is allowed to deviate from + the expected value. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in days. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in hours. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in minutes. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in seconds. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in milliseconds. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in clock ticks. + + Self + + + + EqualityAdapter class handles all equality comparisons + that use an IEqualityComparer, IEqualityComparer<T> + or a ComparisonAdapter. + + + + + Compares two objects, returning true if they are equal + + + + + Returns true if the two objects can be compared by this adapter. + The base adapter cannot handle IEnumerables except for strings. + + + + + Returns an EqualityAdapter that wraps an IComparer. + + + + + Returns an EqualityAdapter that wraps an IEqualityComparer. + + + + + Returns an EqualityAdapter that wraps an IEqualityComparer<T>. + + + + + Returns an EqualityAdapter that wraps an IComparer<T>. + + + + + Returns an EqualityAdapter that wraps a Comparison<T>. + + + + + EqualityAdapter that wraps an IComparer. + + + + + Returns true if the two objects can be compared by this adapter. + Generic adapter requires objects of the specified type. + + + + + EqualityAdapter that wraps an IComparer. + + + + Helper routines for working with floating point numbers + + + The floating point comparison code is based on this excellent article: + http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm + + + "ULP" means Unit in the Last Place and in the context of this library refers to + the distance between two adjacent floating point numbers. IEEE floating point + numbers can only represent a finite subset of natural numbers, with greater + accuracy for smaller numbers and lower accuracy for very large numbers. + + + If a comparison is allowed "2 ulps" of deviation, that means the values are + allowed to deviate by up to 2 adjacent floating point values, which might be + as low as 0.0000001 for small numbers or as high as 10.0 for large numbers. + + + + + Compares two floating point values for equality + First floating point value to be compared + Second floating point value t be compared + + Maximum number of representable floating point values that are allowed to + be between the left and the right floating point values + + True if both numbers are equal or close to being equal + + + Floating point values can only represent a finite subset of natural numbers. + For example, the values 2.00000000 and 2.00000024 can be stored in a float, + but nothing inbetween them. + + + This comparison will count how many possible floating point values are between + the left and the right number. If the number of possible values between both + numbers is less than or equal to maxUlps, then the numbers are considered as + being equal. + + + Implementation partially follows the code outlined here: + http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ + + + + + Compares two double precision floating point values for equality + First double precision floating point value to be compared + Second double precision floating point value t be compared + + Maximum number of representable double precision floating point values that are + allowed to be between the left and the right double precision floating point values + + True if both numbers are equal or close to being equal + + + Double precision floating point values can only represent a limited series of + natural numbers. For example, the values 2.0000000000000000 and 2.0000000000000004 + can be stored in a double, but nothing inbetween them. + + + This comparison will count how many possible double precision floating point + values are between the left and the right number. If the number of possible + values between both numbers is less than or equal to maxUlps, then the numbers + are considered as being equal. + + + Implementation partially follows the code outlined here: + http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ + + + + + + Reinterprets the memory contents of a floating point value as an integer value + + + Floating point value whose memory contents to reinterpret + + + The memory contents of the floating point value interpreted as an integer + + + + + Reinterprets the memory contents of a double precision floating point + value as an integer value + + + Double precision floating point value whose memory contents to reinterpret + + + The memory contents of the double precision floating point value + interpreted as an integer + + + + + Reinterprets the memory contents of an integer as a floating point value + + Integer value whose memory contents to reinterpret + + The memory contents of the integer value interpreted as a floating point value + + + + + Reinterprets the memory contents of an integer value as a double precision + floating point value + + Integer whose memory contents to reinterpret + + The memory contents of the integer interpreted as a double precision + floating point value + + + + Union of a floating point variable and an integer + + + The union's value as a floating point variable + + + The union's value as an integer + + + The union's value as an unsigned integer + + + Union of a double precision floating point variable and a long + + + The union's value as a double precision floating point variable + + + The union's value as a long + + + The union's value as an unsigned long + + + + Tests whether a value is greater than the value supplied to its constructor + + + + + The value against which a comparison is to be made + + + + + Initializes a new instance of the class. + + The expected value. + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Tests whether a value is greater than or equal to the value supplied to its constructor + + + + + The value against which a comparison is to be made + + + + + Initializes a new instance of the class. + + The expected value. + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Tests whether a value is less than the value supplied to its constructor + + + + + The value against which a comparison is to be made + + + + + Initializes a new instance of the class. + + The expected value. + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Tests whether a value is less than or equal to the value supplied to its constructor + + + + + The value against which a comparison is to be made + + + + + Initializes a new instance of the class. + + The expected value. + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + MessageWriter is the abstract base for classes that write + constraint descriptions and messages in some form. The + class has separate methods for writing various components + of a message, allowing implementations to tailor the + presentation as needed. + + + + + Construct a MessageWriter given a culture + + + + + Method to write single line message with optional args, usually + written to precede the general failure message. + + The message to be written + Any arguments used in formatting the message + + + + Method to write single line message with optional args, usually + written to precede the general failure message, at a givel + indentation level. + + The indentation level of the message + The message to be written + Any arguments used in formatting the message + + + + Display Expected and Actual lines for a constraint. This + is called by MessageWriter's default implementation of + WriteMessageTo and provides the generic two-line display. + + The constraint that failed + + + + Display Expected and Actual lines for given values. This + method may be called by constraints that need more control over + the display of actual and expected values than is provided + by the default implementation. + + The expected value + The actual value causing the failure + + + + Display Expected and Actual lines for given values, including + a tolerance value on the Expected line. + + The expected value + The actual value causing the failure + The tolerance within which the test was made + + + + Display the expected and actual string values on separate lines. + If the mismatch parameter is >=0, an additional line is displayed + line containing a caret that points to the mismatch point. + + The expected string value + The actual string value + The point at which the strings don't match or -1 + If true, case is ignored in locating the point where the strings differ + If true, the strings should be clipped to fit the line + + + + Writes the text for a connector. + + The connector. + + + + Writes the text for a predicate. + + The predicate. + + + + Writes the text for an expected value. + + The expected value. + + + + Writes the text for a modifier + + The modifier. + + + + Writes the text for an actual value. + + The actual value. + + + + Writes the text for a generalized value. + + The value. + + + + Writes the text for a collection value, + starting at a particular point, to a max length + + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write + + + + Abstract method to get the max line length + + + + + Static methods used in creating messages + + + + + Static string used when strings are clipped + + + + + Returns the representation of a type as used in NUnitLite. + This is the same as Type.ToString() except for arrays, + which are displayed with their declared sizes. + + + + + + + Converts any control characters in a string + to their escaped representation. + + The string to be converted + The converted string + + + + Return the a string representation for a set of indices into an array + + Array of indices for which a string is needed + + + + Get an array of indices representing the point in a enumerable, + collection or array corresponding to a single int index into the + collection. + + The collection to which the indices apply + Index in the collection + Array of indices + + + + Clip a string to a given length, starting at a particular offset, returning the clipped + string with ellipses representing the removed parts + + The string to be clipped + The maximum permitted length of the result string + The point at which to start clipping + The clipped string + + + + Clip the expected and actual strings in a coordinated fashion, + so that they may be displayed together. + + + + + + + + + Shows the position two strings start to differ. Comparison + starts at the start index. + + The expected string + The actual string + The index in the strings at which comparison should start + Boolean indicating whether case should be ignored + -1 if no mismatch found, or the index where mismatch found + + + + The Numerics class contains common operations on numeric values. + + + + + Checks the type of the object, returning true if + the object is a numeric type. + + The object to check + true if the object is a numeric type + + + + Checks the type of the object, returning true if + the object is a floating point numeric type. + + The object to check + true if the object is a floating point numeric type + + + + Checks the type of the object, returning true if + the object is a fixed point numeric type. + + The object to check + true if the object is a fixed point numeric type + + + + Test two numeric values for equality, performing the usual numeric + conversions and using a provided or default tolerance. If the tolerance + provided is Empty, this method may set it to a default tolerance. + + The expected value + The actual value + A reference to the tolerance in effect + True if the values are equal + + + + Compare two numeric values, performing the usual numeric conversions. + + The expected value + The actual value + The relationship of the values to each other + + + + NUnitComparer encapsulates NUnit's default behavior + in comparing two objects. + + + + + Compares two objects + + + + + + + + Returns the default NUnitComparer. + + + + + Generic version of NUnitComparer + + + + + + Compare two objects of the same type + + + + + NUnitEqualityComparer encapsulates NUnit's handling of + equality tests between objects. + + + + + + + + + + Compares two objects for equality within a tolerance + + The first object to compare + The second object to compare + The tolerance to use in the comparison + + + + + If true, all string comparisons will ignore case + + + + + If true, arrays will be treated as collections, allowing + those of different dimensions to be compared + + + + + Comparison objects used in comparisons for some constraints. + + + + + Compares two objects for equality within a tolerance. + + + + + Helper method to compare two arrays + + + + + Method to compare two DirectoryInfo objects + + first directory to compare + second directory to compare + true if equivalent, false if not + + + + Returns the default NUnitEqualityComparer + + + + + Gets and sets a flag indicating whether case should + be ignored in determining equality. + + + + + Gets and sets a flag indicating that arrays should be + compared as collections, without regard to their shape. + + + + + Gets and sets an external comparer to be used to + test for equality. It is applied to members of + collections, in place of NUnit's own logic. + + + + + Gets the list of failure points for the last Match performed. + + + + + FailurePoint class represents one point of failure + in an equality test. + + + + + The location of the failure + + + + + The expected value + + + + + The actual value + + + + + Indicates whether the expected value is valid + + + + + Indicates whether the actual value is valid + + + + + PathConstraint serves as the abstract base of constraints + that operate on paths and provides several helper methods. + + + + + The expected path used in the constraint + + + + + The actual path being tested + + + + + Flag indicating whether a caseInsensitive comparison should be made + + + + + Construct a PathConstraint for a give expected path + + The expected path + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Returns true if the expected path and actual path match + + + + + Returns the string representation of this constraint + + + + + Canonicalize the provided path + + + The path in standardized form + + + + Test whether two paths are the same + + The first path + The second path + Indicates whether case should be ignored + + + + + Test whether one path is under another path + + The first path - supposed to be the parent path + The second path - supposed to be the child path + Indicates whether case should be ignored + + + + + Test whether one path is the same as or under another path + + The first path - supposed to be the parent path + The second path - supposed to be the child path + + + + + Modifies the current instance to be case-insensitve + and returns it. + + + + + Modifies the current instance to be case-sensitve + and returns it. + + + + + Summary description for SamePathConstraint. + + + + + Initializes a new instance of the class. + + The expected path + + + + Test whether the constraint is satisfied by a given value + + The expected path + The actual path + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + SubPathConstraint tests that the actual path is under the expected path + + + + + Initializes a new instance of the class. + + The expected path + + + + Test whether the constraint is satisfied by a given value + + The expected path + The actual path + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + SamePathOrUnderConstraint tests that one path is under another + + + + + Initializes a new instance of the class. + + The expected path + + + + Test whether the constraint is satisfied by a given value + + The expected path + The actual path + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Predicate constraint wraps a Predicate in a constraint, + returning success if the predicate is true. + + + + + Construct a PredicateConstraint from a predicate + + + + + Determines whether the predicate succeeds when applied + to the actual value. + + + + + Writes the description to a MessageWriter + + + + + NotConstraint negates the effect of some other constraint + + + + + Initializes a new instance of the class. + + The base constraint to be negated. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for if the base constraint fails, false if it succeeds + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a MessageWriter. + + The writer on which the actual value is displayed + + + + AllItemsConstraint applies another constraint to each + item in a collection, succeeding if they all succeed. + + + + + Construct an AllItemsConstraint on top of an existing constraint + + + + + + Apply the item constraint to each item in the collection, + failing if any item fails. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + SomeItemsConstraint applies another constraint to each + item in a collection, succeeding if any of them succeeds. + + + + + Construct a SomeItemsConstraint on top of an existing constraint + + + + + + Apply the item constraint to each item in the collection, + succeeding if any item succeeds. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + NoItemConstraint applies another constraint to each + item in a collection, failing if any of them succeeds. + + + + + Construct a NoItemConstraint on top of an existing constraint + + + + + + Apply the item constraint to each item in the collection, + failing if any item fails. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + ExactCoutConstraint applies another constraint to each + item in a collection, succeeding only if a specified + number of items succeed. + + + + + Construct an ExactCountConstraint on top of an existing constraint + + + + + + + Apply the item constraint to each item in the collection, + succeeding only if the expected number of items pass. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + PropertyExistsConstraint tests that a named property + exists on the object provided through Match. + + Originally, PropertyConstraint provided this feature + in addition to making optional tests on the vaue + of the property. The two constraints are now separate. + + + + + Initializes a new instance of the class. + + The name of the property. + + + + Test whether the property exists for a given object + + The object to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. + + The writer on which the actual value is displayed + + + + Returns the string representation of the constraint. + + + + + + PropertyConstraint extracts a named property and uses + its value as the actual value for a chained constraint. + + + + + Initializes a new instance of the class. + + The name. + The constraint to apply to the property. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + Returns the string representation of the constraint. + + + + + + RangeConstraint tests whethe two values are within a + specified range. + + + + + Initializes a new instance of the class. + + From. + To. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + ResolvableConstraintExpression is used to represent a compound + constraint being constructed at a point where the last operator + may either terminate the expression or may have additional + qualifying constraints added to it. + + It is used, for example, for a Property element or for + an Exception element, either of which may be optionally + followed by constraints that apply to the property or + exception. + + + + + Create a new instance of ResolvableConstraintExpression + + + + + Create a new instance of ResolvableConstraintExpression, + passing in a pre-populated ConstraintBuilder. + + + + + Resolve the current expression to a Constraint + + + + + This operator creates a constraint that is satisfied only if both + argument constraints are satisfied. + + + + + This operator creates a constraint that is satisfied only if both + argument constraints are satisfied. + + + + + This operator creates a constraint that is satisfied only if both + argument constraints are satisfied. + + + + + This operator creates a constraint that is satisfied if either + of the argument constraints is satisfied. + + + + + This operator creates a constraint that is satisfied if either + of the argument constraints is satisfied. + + + + + This operator creates a constraint that is satisfied if either + of the argument constraints is satisfied. + + + + + This operator creates a constraint that is satisfied if the + argument constraint is not satisfied. + + + + + Appends an And Operator to the expression + + + + + Appends an Or operator to the expression. + + + + + ReusableConstraint wraps a resolved constraint so that it + may be saved and reused as needed. + + + + + Construct a ReusableConstraint + + The constraint or expression to be reused + + + + Conversion operator from a normal constraint to a ReusableConstraint. + + The original constraint to be wrapped as a ReusableConstraint + + + + + Returns the string representation of the constraint. + + A string representing the constraint + + + + Resolves the ReusableConstraint by returning the constraint + that it originally wrapped. + + A resolved constraint + + + + SameAsConstraint tests whether an object is identical to + the object passed to its constructor + + + + + Initializes a new instance of the class. + + The expected object. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + BinarySerializableConstraint tests whether + an object is serializable in binary format. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + Returns the string representation + + + + + BinarySerializableConstraint tests whether + an object is serializable in binary format. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + Returns the string representation of this constraint + + + + + StringConstraint is the abstract base for constraints + that operate on strings. It supports the IgnoreCase + modifier for string operations. + + + + + The expected value + + + + + Indicates whether tests should be case-insensitive + + + + + Constructs a StringConstraint given an expected value + + The expected value + + + + Modify the constraint to ignore case in matching. + + + + + EmptyStringConstraint tests whether a string is empty. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + NullEmptyStringConstraint tests whether a string is either null or empty. + + + + + Constructs a new NullOrEmptyStringConstraint + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + SubstringConstraint can test whether a string contains + the expected substring. + + + + + Initializes a new instance of the class. + + The expected. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + StartsWithConstraint can test whether a string starts + with an expected substring. + + + + + Initializes a new instance of the class. + + The expected string + + + + Test whether the constraint is matched by the actual value. + This is a template method, which calls the IsMatch method + of the derived class. + + + + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + EndsWithConstraint can test whether a string ends + with an expected substring. + + + + + Initializes a new instance of the class. + + The expected string + + + + Test whether the constraint is matched by the actual value. + This is a template method, which calls the IsMatch method + of the derived class. + + + + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + RegexConstraint can test whether a string matches + the pattern provided. + + + + + Initializes a new instance of the class. + + The pattern. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + ThrowsConstraint is used to test the exception thrown by + a delegate by applying a constraint to it. + + + + + Initializes a new instance of the class, + using a constraint to be applied to the exception. + + A constraint to apply to the caught exception. + + + + Executes the code of the delegate and captures any exception. + If a non-null base constraint was provided, it applies that + constraint to the exception. + + A delegate representing the code to be tested + True if an exception is thrown and the constraint succeeds, otherwise false + + + + Converts an ActualValueDelegate to a TestDelegate + before calling the primary overload. + + + + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + Returns the string representation of this constraint + + + + + Get the actual exception thrown - used by Assert.Throws. + + + + + ThrowsNothingConstraint tests that a delegate does not + throw an exception. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True if no exception is thrown, otherwise false + + + + Converts an ActualValueDelegate to a TestDelegate + before calling the primary overload. + + + + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + Modes in which the tolerance value for a comparison can + be interpreted. + + + + + The tolerance was created with a value, without specifying + how the value would be used. This is used to prevent setting + the mode more than once and is generally changed to Linear + upon execution of the test. + + + + + The tolerance is used as a numeric range within which + two compared values are considered to be equal. + + + + + Interprets the tolerance as the percentage by which + the two compared values my deviate from each other. + + + + + Compares two values based in their distance in + representable numbers. + + + + + The Tolerance class generalizes the notion of a tolerance + within which an equality test succeeds. Normally, it is + used with numeric types, but it can be used with any + type that supports taking a difference between two + objects and comparing that difference to a value. + + + + + Constructs a linear tolerance of a specdified amount + + + + + Constructs a tolerance given an amount and ToleranceMode + + + + + Tests that the current Tolerance is linear with a + numeric value, throwing an exception if it is not. + + + + + Returns an empty Tolerance object, equivalent to + specifying no tolerance. In most cases, it results + in an exact match but for floats and doubles a + default tolerance may be used. + + + + + Returns a zero Tolerance object, equivalent to + specifying an exact match. + + + + + Gets the ToleranceMode for the current Tolerance + + + + + Gets the value of the current Tolerance instance. + + + + + Returns a new tolerance, using the current amount as a percentage. + + + + + Returns a new tolerance, using the current amount in Ulps. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of days. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of hours. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of minutes. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of seconds. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of milliseconds. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of clock ticks. + + + + + Returns true if the current tolerance is empty. + + + + + TypeConstraint is the abstract base for constraints + that take a Type as their expected value. + + + + + The expected Type used by the constraint + + + + + Construct a TypeConstraint for a given Type + + + + + + Write the actual value for a failing constraint test to a + MessageWriter. TypeConstraints override this method to write + the name of the type. + + The writer on which the actual value is displayed + + + + ExactTypeConstraint is used to test that an object + is of the exact type provided in the constructor + + + + + Construct an ExactTypeConstraint for a given Type + + The expected Type. + + + + Test that an object is of the exact type specified + + The actual value. + True if the tested object is of the exact type provided, otherwise false. + + + + Write the description of this constraint to a MessageWriter + + The MessageWriter to use + + + + ExceptionTypeConstraint is a special version of ExactTypeConstraint + used to provided detailed info about the exception thrown in + an error message. + + + + + Constructs an ExceptionTypeConstraint + + + + + Write the actual value for a failing constraint test to a + MessageWriter. Overriden to write additional information + in the case of an Exception. + + The MessageWriter to use + + + + InstanceOfTypeConstraint is used to test that an object + is of the same type provided or derived from it. + + + + + Construct an InstanceOfTypeConstraint for the type provided + + The expected Type + + + + Test whether an object is of the specified type or a derived type + + The object to be tested + True if the object is of the provided type or derives from it, otherwise false. + + + + Write a description of this constraint to a MessageWriter + + The MessageWriter to use + + + + AssignableFromConstraint is used to test that an object + can be assigned from a given Type. + + + + + Construct an AssignableFromConstraint for the type provided + + + + + + Test whether an object can be assigned from the specified type + + The object to be tested + True if the object can be assigned a value of the expected Type, otherwise false. + + + + Write a description of this constraint to a MessageWriter + + The MessageWriter to use + + + + AssignableToConstraint is used to test that an object + can be assigned to a given Type. + + + + + Construct an AssignableToConstraint for the type provided + + + + + + Test whether an object can be assigned to the specified type + + The object to be tested + True if the object can be assigned a value of the expected Type, otherwise false. + + + + Write a description of this constraint to a MessageWriter + + The MessageWriter to use + + + + Thrown when an assertion failed. + + + + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Thrown when an assertion failed. + + + + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Thrown when a test executes inconclusively. + + + + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Thrown when an assertion failed. + + + + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + + + + + + + Compares two objects of a given Type for equality within a tolerance + + The first object to compare + The second object to compare + The tolerance to use in the comparison + + + + + The different targets a test action attribute can be applied to + + + + + Default target, which is determined by where the action attribute is attached + + + + + Target a individual test case + + + + + Target a suite of test cases + + + + + Delegate used by tests that execute code and + capture any thrown exception. + + + + + The Assert class contains a collection of static methods that + implement the most common assertions used in NUnit. + + + + + We don't actually want any instances of this object, but some people + like to inherit from it to add other static methods. Hence, the + protected constructor disallows any instances of this object. + + + + + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + Helper for Assert.AreEqual(double expected, double actual, ...) + allowing code generation to work consistently. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + + The message to initialize the with. + + + + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + + + + + Throws an with the message and arguments + that are passed in. This is used by the other Assert functions. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws an with the message that is + passed in. This is used by the other Assert functions. + + The message to initialize the with. + + + + Throws an . + This is used by the other Assert functions. + + + + + Throws an with the message and arguments + that are passed in. This causes the test to be reported as ignored. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws an with the message that is + passed in. This causes the test to be reported as ignored. + + The message to initialize the with. + + + + Throws an . + This causes the test to be reported as ignored. + + + + + Throws an with the message and arguments + that are passed in. This causes the test to be reported as inconclusive. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws an with the message that is + passed in. This causes the test to be reported as inconclusive. + + The message to initialize the with. + + + + Throws an . + This causes the test to be reported as Inconclusive. + + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint to be applied + The actual value to test + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint to be applied + The actual value to test + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint to be applied + The actual value to test + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint to be applied + The actual value to test + The message that will be displayed on failure + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display if the condition is false + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + Used as a synonym for That in rare cases where a private setter + causes a Visual Basic compilation error. + + A Constraint to be applied + The actual value to test + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + Used as a synonym for That in rare cases where a private setter + causes a Visual Basic compilation error. + + A Constraint to be applied + The actual value to test + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + Used as a synonym for That in rare cases where a private setter + causes a Visual Basic compilation error. + + + This method is provided for use by VB developers needing to test + the value of properties with private setters. + + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. + + A constraint to be satisfied by the exception + A TestSnippet delegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. + + A constraint to be satisfied by the exception + A TestSnippet delegate + The message that will be displayed on failure + + + + Verifies that a delegate throws a particular exception when called. + + A constraint to be satisfied by the exception + A TestSnippet delegate + + + + Verifies that a delegate throws a particular exception when called. + + The exception Type expected + A TestSnippet delegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. + + The exception Type expected + A TestSnippet delegate + The message that will be displayed on failure + + + + Verifies that a delegate throws a particular exception when called. + + The exception Type expected + A TestSnippet delegate + + + + Verifies that a delegate throws a particular exception when called. + + Type of the expected exception + A TestSnippet delegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. + + Type of the expected exception + A TestSnippet delegate + The message that will be displayed on failure + + + + Verifies that a delegate throws a particular exception when called. + + Type of the expected exception + A TestSnippet delegate + + + + Verifies that a delegate throws an exception when called + and returns it. + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception when called + and returns it. + + A TestDelegate + The message that will be displayed on failure + + + + Verifies that a delegate throws an exception when called + and returns it. + + A TestDelegate + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + + + + Verifies that a delegate does not throw an exception + + A TestSnippet delegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate does not throw an exception. + + A TestSnippet delegate + The message that will be displayed on failure + + + + Verifies that a delegate does not throw an exception. + + A TestSnippet delegate + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + The message to display in case of failure + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + The message to display in case of failure + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + + + + Assert that a string is empty - that is equal to string.Empty + + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that a string is empty - that is equal to string.Empty + + The string to be tested + The message to display in case of failure + + + + Assert that a string is empty - that is equal to string.Empty + + The string to be tested + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing ICollection + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing ICollection + The message to display in case of failure + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing ICollection + + + + Assert that a string is not empty - that is not equal to string.Empty + + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that a string is not empty - that is not equal to string.Empty + + The string to be tested + The message to display in case of failure + + + + Assert that a string is not empty - that is not equal to string.Empty + + The string to be tested + + + + Assert that an array, list or other collection is not empty + + An array, list or other collection implementing ICollection + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that an array, list or other collection is not empty + + An array, list or other collection implementing ICollection + The message to display in case of failure + + + + Assert that an array, list or other collection is not empty + + An array, list or other collection implementing ICollection + + + + Assert that a string is either null or equal to string.Empty + + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that a string is either null or equal to string.Empty + + The string to be tested + The message to display in case of failure + + + + Assert that a string is either null or equal to string.Empty + + The string to be tested + + + + Assert that a string is not null or empty + + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that a string is not null or empty + + The string to be tested + The message to display in case of failure + + + + Assert that a string is not null or empty + + The string to be tested + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are equal. If they are not, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + + + + Verifies that two objects are equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are not equal an is thrown. + + The value that is expected + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two objects are equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are not equal an is thrown. + + The value that is expected + The actual value + The message to display in case of failure + + + + Verifies that two objects are equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are not equal an is thrown. + + The value that is expected + The actual value + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two values are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two objects are not equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are equal an is thrown. + + The value that is expected + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two objects are not equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are equal an is thrown. + + The value that is expected + The actual value + The message to display in case of failure + + + + Verifies that two objects are not equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are equal an is thrown. + + The value that is expected + The actual value + + + + Asserts that two objects refer to the same object. If they + are not the same an is thrown. + + The expected object + The actual object + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that two objects refer to the same object. If they + are not the same an is thrown. + + The expected object + The actual object + The message to display in case of failure + + + + Asserts that two objects refer to the same object. If they + are not the same an is thrown. + + The expected object + The actual object + + + + Asserts that two objects do not refer to the same object. If they + are the same an is thrown. + + The expected object + The actual object + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that two objects do not refer to the same object. If they + are the same an is thrown. + + The expected object + The actual object + The message to display in case of failure + + + + Asserts that two objects do not refer to the same object. If they + are the same an is thrown. + + The expected object + The actual object + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Asserts that an object is contained in a list. + + The expected object + The list to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is contained in a list. + + The expected object + The list to be examined + The message to display in case of failure + + + + Asserts that an object is contained in a list. + + The expected object + The list to be examined + + + + Gets the number of assertions executed so far and + resets the counter to zero. + + + + + AssertionHelper is an optional base class for user tests, + allowing the use of shorter names for constraints and + asserts and avoiding conflict with the definition of + , from which it inherits much of its + behavior, in certain mock object frameworks. + + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. Works + identically to Assert.That + + A Constraint to be applied + The actual value to test + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. Works + identically to Assert.That. + + A Constraint to be applied + The actual value to test + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. Works + identically to Assert.That + + A Constraint to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint to be applied + The actual value to test + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint to be applied + The actual value to test + The message that will be displayed on failure + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically to Assert.That. + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically to Assert.That. + + The evaluated condition + The message to display if the condition is false + + + + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically Assert.That. + + The evaluated condition + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + + + + Returns a ListMapper based on a collection. + + The original collection + + + + + Provides static methods to express the assumptions + that must be met for a test to give a meaningful + result. If an assumption is not met, the test + should produce an inconclusive result. + + + + + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + The actual value to test + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + The actual value to test + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display if the condition is false + + + + Asserts that a condition is true. If the condition is false the + method throws an . + + The evaluated condition + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + + + + A set of Assert methods operationg on one or more collections + + + + + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + Asserts that all items contained in collection are of the type specified by expectedType. + + IEnumerable containing objects to be considered + System.Type that all objects in collection must be instances of + + + + Asserts that all items contained in collection are of the type specified by expectedType. + + IEnumerable containing objects to be considered + System.Type that all objects in collection must be instances of + The message that will be displayed on failure + + + + Asserts that all items contained in collection are of the type specified by expectedType. + + IEnumerable containing objects to be considered + System.Type that all objects in collection must be instances of + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that all items contained in collection are not equal to null. + + IEnumerable containing objects to be considered + + + + Asserts that all items contained in collection are not equal to null. + + IEnumerable containing objects to be considered + The message that will be displayed on failure + + + + Asserts that all items contained in collection are not equal to null. + + IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Ensures that every object contained in collection exists within the collection + once and only once. + + IEnumerable of objects to be considered + + + + Ensures that every object contained in collection exists within the collection + once and only once. + + IEnumerable of objects to be considered + The message that will be displayed on failure + + + + Ensures that every object contained in collection exists within the collection + once and only once. + + IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + + + + Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are not exactly equal. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are not exactly equal. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + + + + Asserts that expected and actual are not exactly equal. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + + + + Asserts that expected and actual are not exactly equal. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure + + + + Asserts that expected and actual are not exactly equal. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are not exactly equal. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are not equivalent. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are not equivalent. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + + + + Asserts that expected and actual are not equivalent. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that collection contains actual as an item. + + IEnumerable of objects to be considered + Object to be found within collection + + + + Asserts that collection contains actual as an item. + + IEnumerable of objects to be considered + Object to be found within collection + The message that will be displayed on failure + + + + Asserts that collection contains actual as an item. + + IEnumerable of objects to be considered + Object to be found within collection + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that collection does not contain actual as an item. + + IEnumerable of objects to be considered + Object that cannot exist within collection + + + + Asserts that collection does not contain actual as an item. + + IEnumerable of objects to be considered + Object that cannot exist within collection + The message that will be displayed on failure + + + + Asserts that collection does not contain actual as an item. + + IEnumerable of objects to be considered + Object that cannot exist within collection + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that superset is not a subject of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + + + + Asserts that superset is not a subject of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + + + + Asserts that superset is not a subject of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that superset is a subset of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + + + + Asserts that superset is a subset of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + + + + Asserts that superset is a subset of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + + + + Assert that an array,list or other collection is empty + + An array, list or other collection implementing IEnumerable + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + + + + Assert that an array,list or other collection is empty + + An array, list or other collection implementing IEnumerable + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + A custom comparer to perform the comparisons + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + A custom comparer to perform the comparisons + The message to be displayed on failure + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + A custom comparer to perform the comparisons + + + + Static helper class used in the constraint-based syntax + + + + + Creates a new SubstringConstraint + + The value of the substring + A SubstringConstraint + + + + Creates a new CollectionContainsConstraint. + + The item that should be found. + A new CollectionContainsConstraint + + + + Summary description for DirectoryAssert + + + + + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + We don't actually want any instances of this object, but some people + like to inherit from it to add other static methods. Hence, the + protected constructor disallows any instances of this object. + + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + The message to display if directories are not equal + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + The message to display if directories are equal + Arguments to be used in formatting the message + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + The message to display if directories are equal + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + The message to display if directories are not equal + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + The message to display if directories are not equal + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + The message to display if directories are not equal + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + The message to display if directories are not equal + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + Arguments to be used in formatting the message + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + Arguments to be used in formatting the message + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + Arguments to be used in formatting the message + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + Arguments to be used in formatting the message + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + + + + Summary description for FileAssert. + + + + + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + We don't actually want any instances of this object, but some people + like to inherit from it to add other static methods. Hence, the + protected constructor disallows any instances of this object. + + + + + Verifies that two Streams are equal. Two Streams are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The expected Stream + The actual Stream + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Verifies that two Streams are equal. Two Streams are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The expected Stream + The actual Stream + The message to display if objects are not equal + + + + Verifies that two Streams are equal. Two Streams are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The expected Stream + The actual Stream + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A file containing the value that is expected + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A file containing the value that is expected + A file containing the actual value + The message to display if objects are not equal + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A file containing the value that is expected + A file containing the actual value + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if objects are not equal + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + + + + Asserts that two Streams are not equal. If they are equal + an is thrown. + + The expected Stream + The actual Stream + The message to be displayed when the two Stream are the same. + Arguments to be used in formatting the message + + + + Asserts that two Streams are not equal. If they are equal + an is thrown. + + The expected Stream + The actual Stream + The message to be displayed when the Streams are the same. + + + + Asserts that two Streams are not equal. If they are equal + an is thrown. + + The expected Stream + The actual Stream + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + A file containing the value that is expected + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + A file containing the value that is expected + A file containing the actual value + The message to display if objects are not equal + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + A file containing the value that is expected + A file containing the actual value + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if objects are not equal + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + + + + GlobalSettings is a place for setting default values used + by the framework in performing asserts. + + + + + Default tolerance for floating point equality + + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. + + + + + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. + + + + + Interface implemented by a user fixture in order to + validate any expected exceptions. It is only called + for test methods marked with the ExpectedException + attribute. + + + + + Method to handle an expected exception + + The exception to be handled + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a constraint that tests two items for equality + + + + + Returns a constraint that tests that two references are the same object + + + + + Returns a constraint that tests whether the + actual value is greater than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the Regex pattern supplied as an argument. + + + + + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the actual value falls + within a specified range. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a constraint that tests for null + + + + + Returns a constraint that tests for True + + + + + Returns a constraint that tests for False + + + + + Returns a constraint that tests for a positive value + + + + + Returns a constraint that tests for a negative value + + + + + Returns a constraint that tests for NaN + + + + + Returns a constraint that tests for empty + + + + + Returns a constraint that tests whether a collection + contains all unique items. + + + + + Returns a constraint that tests whether an object graph is serializable in binary format. + + + + + Returns a constraint that tests whether an object graph is serializable in xml format. + + + + + Returns a constraint that tests whether a collection is ordered + + + + + The Iz class is a synonym for Is intended for use in VB, + which regards Is as a keyword. + + + + + The List class is a helper class with properties and methods + that supply a number of constraints used with lists and collections. + + + + + List.Map returns a ListMapper, which can be used to map + the original collection to another collection. + + + + + + + ListMapper is used to transform a collection used as an actual argument + producing another collection to be used in the assertion. + + + + + Construct a ListMapper based on a collection + + The collection to be transformed + + + + Produces a collection containing all the values of a property + + The collection of property values + + + + + Randomizer returns a set of random values in a repeatable + way, to allow re-running of tests if necessary. + + + + + Get a randomizer for a particular member, returning + one that has already been created if it exists. + This ensures that the same values are generated + each time the tests are reloaded. + + + + + Get a randomizer for a particular parameter, returning + one that has already been created if it exists. + This ensures that the same values are generated + each time the tests are reloaded. + + + + + Construct a randomizer using a random seed + + + + + Construct a randomizer using a specified seed + + + + + Return an array of random doubles between 0.0 and 1.0. + + + + + + + Return an array of random doubles with values in a specified range. + + + + + Return an array of random ints with values in a specified range. + + + + + Get a random seed for use in creating a randomizer. + + + + + The SpecialValue enum is used to represent TestCase arguments + that cannot be used as arguments to an Attribute. + + + + + Null represents a null value, which cannot be used as an + argument to an attriute under .NET 1.x + + + + + Basic Asserts on strings. + + + + + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + The message to display in case of failure + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + + + + Asserts that a string is not found within another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + The message to display in case of failure + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + + + + Asserts that a string starts with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string starts with another string. + + The expected string + The string to be examined + The message to display in case of failure + + + + Asserts that a string starts with another string. + + The expected string + The string to be examined + + + + Asserts that a string does not start with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string does not start with another string. + + The expected string + The string to be examined + The message to display in case of failure + + + + Asserts that a string does not start with another string. + + The expected string + The string to be examined + + + + Asserts that a string ends with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string ends with another string. + + The expected string + The string to be examined + The message to display in case of failure + + + + Asserts that a string ends with another string. + + The expected string + The string to be examined + + + + Asserts that a string does not end with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string does not end with another string. + + The expected string + The string to be examined + The message to display in case of failure + + + + Asserts that a string does not end with another string. + + The expected string + The string to be examined + + + + Asserts that two strings are equal, without regard to case. + + The expected string + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that two strings are equal, without regard to case. + + The expected string + The actual string + The message to display in case of failure + + + + Asserts that two strings are equal, without regard to case. + + The expected string + The actual string + + + + Asserts that two strings are not equal, without regard to case. + + The expected string + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that two strings are Notequal, without regard to case. + + The expected string + The actual string + The message to display in case of failure + + + + Asserts that two strings are not equal, without regard to case. + + The expected string + The actual string + + + + Asserts that a string matches an expected regular expression pattern. + + The regex pattern to be matched + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string matches an expected regular expression pattern. + + The regex pattern to be matched + The actual string + The message to display in case of failure + + + + Asserts that a string matches an expected regular expression pattern. + + The regex pattern to be matched + The actual string + + + + Asserts that a string does not match an expected regular expression pattern. + + The regex pattern to be used + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string does not match an expected regular expression pattern. + + The regex pattern to be used + The actual string + The message to display in case of failure + + + + Asserts that a string does not match an expected regular expression pattern. + + The regex pattern to be used + The actual string + + + + The TestCaseData class represents a set of arguments + and other parameter info to be used for a parameterized + test case. It provides a number of instance modifiers + for use in initializing the test case. + + Note: Instance modifiers are getters that return + the same instance after modifying it's state. + + + + + The argument list to be provided to the test + + + + + The expected result to be returned + + + + + Set to true if this has an expected result + + + + + The expected exception Type + + + + + The FullName of the expected exception + + + + + The name to be used for the test + + + + + The description of the test + + + + + A dictionary of properties, used to add information + to tests without requiring the class to change. + + + + + If true, indicates that the test case is to be ignored + + + + + If true, indicates that the test case is marked explicit + + + + + The reason for ignoring a test case + + + + + Initializes a new instance of the class. + + The arguments. + + + + Initializes a new instance of the class. + + The argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + The third argument. + + + + Sets the expected result for the test + + The expected result + A modified TestCaseData + + + + Sets the expected exception type for the test + + Type of the expected exception. + The modified TestCaseData instance + + + + Sets the expected exception type for the test + + FullName of the expected exception. + The modified TestCaseData instance + + + + Sets the name of the test case + + The modified TestCaseData instance + + + + Sets the description for the test case + being constructed. + + The description. + The modified TestCaseData instance. + + + + Applies a category to the test + + + + + + + Applies a named property to the test + + + + + + + + Applies a named property to the test + + + + + + + + Applies a named property to the test + + + + + + + + Ignores this TestCase. + + + + + + Ignores this TestCase, specifying the reason. + + The reason. + + + + + Marks this TestCase as Explicit + + + + + + Marks this TestCase as Explicit, specifying the reason. + + The reason. + + + + + Gets the argument list to be provided to the test + + + + + Gets the expected result + + + + + Returns true if the result has been set + + + + + Gets the expected exception Type + + + + + Gets the FullName of the expected exception + + + + + Gets the name to be used for the test + + + + + Gets the description of the test + + + + + Gets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets a value indicating whether this is explicit. + + true if explicit; otherwise, false. + + + + Gets the ignore reason. + + The ignore reason. + + + + Gets a list of categories associated with this test. + + + + + Gets the property dictionary for this test + + + + + Provide the context information of the current test + + + + + Constructs a TestContext using the provided context dictionary + + A context dictionary + + + + Get the current test context. This is created + as needed. The user may save the context for + use within a test, but it should not be used + outside the test for which it is created. + + + + + Gets a TestAdapter representing the currently executing test in this context. + + + + + Gets a ResultAdapter representing the current result for the test + executing in this context. + + + + + Gets the directory containing the current test assembly. + + + + + Gets the directory to be used for outputing files created + by this test run. + + + + + TestAdapter adapts a Test for consumption by + the user test code. + + + + + Constructs a TestAdapter for this context + + The context dictionary + + + + The name of the test. + + + + + The FullName of the test + + + + + The properties of the test. + + + + + ResultAdapter adapts a TestResult for consumption by + the user test code. + + + + + Construct a ResultAdapter for a context + + The context holding the result + + + + The TestState of current test. This maps to the ResultState + used in nunit.core and is subject to change in the future. + + + + + The TestStatus of current test. This enum will be used + in future versions of NUnit and so is to be preferred + to the TestState value. + + + + + Provides details about a test + + + + + Creates an instance of TestDetails + + The fixture that the test is a member of, if available. + The method that implements the test, if available. + The full name of the test. + A string representing the type of test, e.g. "Test Case". + Indicates if the test represents a suite of tests. + + + + The fixture that the test is a member of, if available. + + + + + The method that implements the test, if available. + + + + + The full name of the test. + + + + + A string representing the type of test, e.g. "Test Case". + + + + + Indicates if the test represents a suite of tests. + + + + + The ResultState enum indicates the result of running a test + + + + + The result is inconclusive + + + + + The test was not runnable. + + + + + The test has been skipped. + + + + + The test has been ignored. + + + + + The test succeeded + + + + + The test failed + + + + + The test encountered an unexpected exception + + + + + The test was cancelled by the user + + + + + The TestStatus enum indicates the result of running a test + + + + + The test was inconclusive + + + + + The test has skipped + + + + + The test succeeded + + + + + The test failed + + + + + Helper class with static methods used to supply constraints + that operate on strings. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the Regex pattern supplied as an argument. + + + + + Returns a constraint that fails if the actual + value matches the pattern supplied as an argument. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + TextMessageWriter writes constraint descriptions and messages + in displayable form as a text stream. It tailors the display + of individual message components to form the standard message + format of NUnit assertion failure messages. + + + + + Prefix used for the expected value line of a message + + + + + Prefix used for the actual value line of a message + + + + + Length of a message prefix + + + + + Construct a TextMessageWriter + + + + + Construct a TextMessageWriter, specifying a user message + and optional formatting arguments. + + + + + + + Method to write single line message with optional args, usually + written to precede the general failure message, at a givel + indentation level. + + The indentation level of the message + The message to be written + Any arguments used in formatting the message + + + + Display Expected and Actual lines for a constraint. This + is called by MessageWriter's default implementation of + WriteMessageTo and provides the generic two-line display. + + The constraint that failed + + + + Display Expected and Actual lines for given values. This + method may be called by constraints that need more control over + the display of actual and expected values than is provided + by the default implementation. + + The expected value + The actual value causing the failure + + + + Display Expected and Actual lines for given values, including + a tolerance value on the expected line. + + The expected value + The actual value causing the failure + The tolerance within which the test was made + + + + Display the expected and actual string values on separate lines. + If the mismatch parameter is >=0, an additional line is displayed + line containing a caret that points to the mismatch point. + + The expected string value + The actual string value + The point at which the strings don't match or -1 + If true, case is ignored in string comparisons + If true, clip the strings to fit the max line length + + + + Writes the text for a connector. + + The connector. + + + + Writes the text for a predicate. + + The predicate. + + + + Write the text for a modifier. + + The modifier. + + + + Writes the text for an expected value. + + The expected value. + + + + Writes the text for an actual value. + + The actual value. + + + + Writes the text for a generalized value. + + The value. + + + + Writes the text for a collection value, + starting at a particular point, to a max length + + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write + + + + Write the generic 'Expected' line for a constraint + + The constraint that failed + + + + Write the generic 'Expected' line for a given value + + The expected value + + + + Write the generic 'Expected' line for a given value + and tolerance. + + The expected value + The tolerance within which the test was made + + + + Write the generic 'Actual' line for a constraint + + The constraint for which the actual value is to be written + + + + Write the generic 'Actual' line for a given value + + The actual value causing a failure + + + + Gets or sets the maximum line length for this writer + + + + + Helper class with properties and methods that supply + constraints that operate on exceptions. + + + + + Creates a constraint specifying the exact type of exception expected + + + + + Creates a constraint specifying the exact type of exception expected + + + + + Creates a constraint specifying the type of exception expected + + + + + Creates a constraint specifying the type of exception expected + + + + + Creates a constraint specifying an expected exception + + + + + Creates a constraint specifying an exception with a given InnerException + + + + + Creates a constraint specifying an expected TargetInvocationException + + + + + Creates a constraint specifying an expected TargetInvocationException + + + + + Creates a constraint specifying an expected TargetInvocationException + + + + + Creates a constraint specifying that no exception is thrown + + + + diff --git a/packages/NUnit.2.6.2/license.txt b/packages/NUnit.2.6.2/license.txt new file mode 100644 index 00000000..724e4652 --- /dev/null +++ b/packages/NUnit.2.6.2/license.txt @@ -0,0 +1,15 @@ +Copyright © 2002-2012 Charlie Poole +Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov +Copyright © 2000-2002 Philip A. Craig + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product documentation is required. + +Portions Copyright © 2002-2012 Charlie Poole or Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov or Copyright © 2000-2002 Philip A. Craig + +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. diff --git a/packages/repositories.config b/packages/repositories.config index c672440b..de05d564 100644 --- a/packages/repositories.config +++ b/packages/repositories.config @@ -5,6 +5,7 @@ + From 7a2ef1a6bf0167f8af736d42ae2d57c7bc2c0876 Mon Sep 17 00:00:00 2001 From: Mark Rendle Date: Mon, 7 Oct 2013 15:27:50 +0100 Subject: [PATCH 07/15] ALL TESTS PASSING --- Simple.Data.Ado/ExecutorFactory.cs | 24 +- Simple.Data.Ado/FunctionExecutor.cs | 13 + Simple.Data.Ado/Simple.Data.Ado.csproj | 1 + .../ConnectionProviderTest.cs | 12 - Simple.Data.SqlCe40Test/FindTests.cs | 2 +- Simple.Data.SqlCe40Test/InsertTests.cs | 2 +- Simple.Data.SqlCe40Test/OrderDetailTests.cs | 2 +- Simple.Data.SqlCe40Test/QueryTest.cs | 2 +- .../SchemaTests/DatabaseSchemaTests.cs | 2 +- Simple.Data.SqlCe40Test/Setup.cs | 26 ++ .../Simple.Data.SqlCe40Test.csproj | 323 +++++++++--------- Simple.Data/Commands/UpsertByCommand.cs | 18 +- Simple.Data/Commands/UpsertCommand.cs | 15 +- Simple.Data/Operations/UpsertOperation.cs | 26 +- 14 files changed, 263 insertions(+), 205 deletions(-) create mode 100644 Simple.Data.Ado/FunctionExecutor.cs create mode 100644 Simple.Data.SqlCe40Test/Setup.cs diff --git a/Simple.Data.Ado/ExecutorFactory.cs b/Simple.Data.Ado/ExecutorFactory.cs index f109a2a3..9930ef18 100644 --- a/Simple.Data.Ado/ExecutorFactory.cs +++ b/Simple.Data.Ado/ExecutorFactory.cs @@ -21,14 +21,30 @@ private static FuncDict CreateFunctionDictionary() dict.Add(CreateFunction(DeleteExecutor.Execute)); dict.Add(CreateFunction(GetExecutor.ExecuteGet)); dict.Add(CreateFunction(UpdateByCriteriaExecutor.ExecuteUpdate)); - dict.Add(CreateFunction(ExecuteFunction)); + dict.Add(CreateFunction(FunctionExecutor.ExecuteFunction)); + dict.Add(CreateFunction(ExecuteUpsert)); return (FuncDict)dict; } - private static OperationResult ExecuteFunction(FunctionOperation operation, AdoAdapter adapter, AdoAdapterTransaction transaction) + private static OperationResult ExecuteUpsert(UpsertOperation operation, AdoAdapter adapter, AdoAdapterTransaction transaction) { - var result = adapter.Execute(operation.FunctionName, operation.Parameters, transaction); - return new MultiDataResult(result); + var checkedEnumerable = CheckedEnumerable.Create(operation.Data); + if (checkedEnumerable.IsEmpty) return CommandResult.Empty; + var upserter = new AdoAdapterUpserter(adapter, transaction.TransactionOrDefault()); + DataResult dataResult; + if (checkedEnumerable.HasMoreThanOneValue) + { + dataResult = + new DataResult(upserter.UpsertMany(operation.TableName, checkedEnumerable.ToList(), + operation.ResultRequired, + (d, e) => operation.ErrorCallback(d, e))); + } + else + { + var row = checkedEnumerable.Single; + dataResult = new DataResult(upserter.Upsert(operation.TableName, checkedEnumerable.Single, operation.Criteria, operation.ResultRequired)); + } + return dataResult; } private static KeyValuePair CreateFunction(Func target) diff --git a/Simple.Data.Ado/FunctionExecutor.cs b/Simple.Data.Ado/FunctionExecutor.cs new file mode 100644 index 00000000..a0f7cc2c --- /dev/null +++ b/Simple.Data.Ado/FunctionExecutor.cs @@ -0,0 +1,13 @@ +namespace Simple.Data.Ado +{ + using Operations; + + internal class FunctionExecutor + { + public static OperationResult ExecuteFunction(FunctionOperation operation, AdoAdapter adapter, AdoAdapterTransaction transaction) + { + var result = adapter.Execute(operation.FunctionName, operation.Parameters, transaction); + return new MultiDataResult(result); + } + } +} \ No newline at end of file diff --git a/Simple.Data.Ado/Simple.Data.Ado.csproj b/Simple.Data.Ado/Simple.Data.Ado.csproj index 9912446b..61f79c6a 100644 --- a/Simple.Data.Ado/Simple.Data.Ado.csproj +++ b/Simple.Data.Ado/Simple.Data.Ado.csproj @@ -99,6 +99,7 @@ + diff --git a/Simple.Data.SqlCe40Test/ConnectionProviderTest.cs b/Simple.Data.SqlCe40Test/ConnectionProviderTest.cs index 1bef114f..39ee8177 100644 --- a/Simple.Data.SqlCe40Test/ConnectionProviderTest.cs +++ b/Simple.Data.SqlCe40Test/ConnectionProviderTest.cs @@ -5,7 +5,6 @@ namespace Simple.Data.SqlCe40Test { - using System.Diagnostics; using Ado; using NUnit.Framework; using SqlCe40; @@ -28,15 +27,4 @@ public void SqlCeDoesNotSupportCompoundStatements() Assert.IsFalse(target.SupportsCompoundStatements); } } - - [SetUpFixture] - public class Setup - { - [SetUp] - public void ForceLoadOfSimpleDataSqlCe40() - { - var provider = new SqlCe40.SqlCe40ConnectionProvider(); - Trace.Write("Loaded provider."); - } - } } diff --git a/Simple.Data.SqlCe40Test/FindTests.cs b/Simple.Data.SqlCe40Test/FindTests.cs index 51335d74..b4015484 100644 --- a/Simple.Data.SqlCe40Test/FindTests.cs +++ b/Simple.Data.SqlCe40Test/FindTests.cs @@ -16,7 +16,7 @@ public class FindTests { private static readonly string DatabasePath = Path.Combine( Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase.Substring(8)), - "TestDatabase.sdf"); + "TestDatabaseCopy.sdf"); [TestFixtureSetUp] public void DeleteAlice() diff --git a/Simple.Data.SqlCe40Test/InsertTests.cs b/Simple.Data.SqlCe40Test/InsertTests.cs index a1dfb8aa..7a722170 100644 --- a/Simple.Data.SqlCe40Test/InsertTests.cs +++ b/Simple.Data.SqlCe40Test/InsertTests.cs @@ -16,7 +16,7 @@ public class InsertTests { private static readonly string DatabasePath = Path.Combine( Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase.Substring(8)), - "TestDatabase.sdf"); + "TestDatabaseCopy.sdf"); [Test] public void TestInsertWithNamedArguments() diff --git a/Simple.Data.SqlCe40Test/OrderDetailTests.cs b/Simple.Data.SqlCe40Test/OrderDetailTests.cs index 748e7703..492ff85f 100644 --- a/Simple.Data.SqlCe40Test/OrderDetailTests.cs +++ b/Simple.Data.SqlCe40Test/OrderDetailTests.cs @@ -13,7 +13,7 @@ public class OrderDetailTests { private static readonly string DatabasePath = Path.Combine( Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase.Substring(8)), - "TestDatabase.sdf"); + "TestDatabaseCopy.sdf"); [Test] public void TestOrderDetail() diff --git a/Simple.Data.SqlCe40Test/QueryTest.cs b/Simple.Data.SqlCe40Test/QueryTest.cs index a326ad4a..5f8f2e73 100644 --- a/Simple.Data.SqlCe40Test/QueryTest.cs +++ b/Simple.Data.SqlCe40Test/QueryTest.cs @@ -9,7 +9,7 @@ public class QueryTest { private static readonly string DatabasePath = Path.Combine( Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase.Substring(8)), - "TestDatabase.sdf"); + "TestDatabaseCopy.sdf"); [Test] public void ShouldSelectFromOneToTen() diff --git a/Simple.Data.SqlCe40Test/SchemaTests/DatabaseSchemaTests.cs b/Simple.Data.SqlCe40Test/SchemaTests/DatabaseSchemaTests.cs index 93fe0a35..3f2062fa 100644 --- a/Simple.Data.SqlCe40Test/SchemaTests/DatabaseSchemaTests.cs +++ b/Simple.Data.SqlCe40Test/SchemaTests/DatabaseSchemaTests.cs @@ -14,7 +14,7 @@ public class DatabaseSchemaTests : DatabaseSchemaTestsBase { private static readonly string DatabasePath = Path.Combine( Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase.Substring(8)), - "TestDatabase.sdf"); + "TestDatabaseCopy.sdf"); protected override Database GetDatabase() { diff --git a/Simple.Data.SqlCe40Test/Setup.cs b/Simple.Data.SqlCe40Test/Setup.cs new file mode 100644 index 00000000..a7ae091d --- /dev/null +++ b/Simple.Data.SqlCe40Test/Setup.cs @@ -0,0 +1,26 @@ +namespace Simple.Data.SqlCe40Test +{ + using System.Diagnostics; + using System.IO; + using System.Reflection; + using NUnit.Framework; + + [SetUpFixture] + public class Setup + { + [SetUp] + public void ForceLoadOfSimpleDataSqlCe40() + { + var provider = new SqlCe40.SqlCe40ConnectionProvider(); + Trace.Write("Loaded provider."); + + var executionDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase.Substring(8)); + Debug.Assert(!ReferenceEquals(executionDirectory, null)); + + var sourcePath = Path.Combine(executionDirectory, "TestDatabase.sdf"); + var databasePath = Path.Combine(executionDirectory, "TestDatabaseCopy.sdf"); + + File.Copy(sourcePath, databasePath, true); + } + } +} \ No newline at end of file diff --git a/Simple.Data.SqlCe40Test/Simple.Data.SqlCe40Test.csproj b/Simple.Data.SqlCe40Test/Simple.Data.SqlCe40Test.csproj index 82a36ba3..b05d56b6 100644 --- a/Simple.Data.SqlCe40Test/Simple.Data.SqlCe40Test.csproj +++ b/Simple.Data.SqlCe40Test/Simple.Data.SqlCe40Test.csproj @@ -1,162 +1,163 @@ - - - - Debug - AnyCPU - - - 2.0 - {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB} - Library - Properties - Simple.Data.SqlCe40Test - Simple.Data.SqlCe40Test - v4.5 - 512 - false - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll - - - ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll - - - - - - - - - - - - False - - - - - - - - - - - - - - - - - - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} - Simple.Data.Ado - - - {43BA3D2C-10D8-470D-A60B-4F06D2F9D539} - Simple.Data.SqlCe40 - - - {7DAB2F13-0392-435E-A934-4567266714BF} - Simple.Data.TestHelper - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - - - Always - - - Always - - - - - False - Microsoft .NET Framework 4 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - False - SQL Server Compact 3.5 SP2 - true - - - False - Windows Installer 3.1 - true - - - - - - - - - ..\..\ - - + + + + Debug + AnyCPU + + + 2.0 + {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB} + Library + Properties + Simple.Data.SqlCe40Test + Simple.Data.SqlCe40Test + v4.5 + 512 + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll + + + ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll + + + ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll + + + + + + + + + + + + False + + + + + + + + + + + + + + + + + + + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} + Simple.Data.Ado + + + {43BA3D2C-10D8-470D-A60B-4F06D2F9D539} + Simple.Data.SqlCe40 + + + {7DAB2F13-0392-435E-A934-4567266714BF} + Simple.Data.TestHelper + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + + + Always + + + Always + + + + + False + Microsoft .NET Framework 4 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + SQL Server Compact 3.5 SP2 + true + + + False + Windows Installer 3.1 + true + + + + + + + + + ..\..\ + + \ No newline at end of file diff --git a/Simple.Data/Commands/UpsertByCommand.cs b/Simple.Data/Commands/UpsertByCommand.cs index 8a33a160..720b1fa9 100644 --- a/Simple.Data/Commands/UpsertByCommand.cs +++ b/Simple.Data/Commands/UpsertByCommand.cs @@ -2,6 +2,7 @@ namespace Simple.Data.Commands { using System; using System.Collections.Generic; + using System.Collections.ObjectModel; using System.Dynamic; using System.Linq; using Extensions; @@ -31,7 +32,7 @@ public object Execute(DataStrategy dataStrategy, DynamicTable table, InvokeMembe var criteriaExpression = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), criteria); var data = binder.NamedArgumentsToDictionary(args); - var operation = new UpsertOperation(table.GetQualifiedName(), data, !binder.IsResultDiscarded()); + var operation = new UpsertOperation(table.GetQualifiedName(), data, !binder.IsResultDiscarded(), criteriaExpression); result = dataStrategy.Run.Execute(operation); } @@ -44,21 +45,26 @@ internal static object UpsertByKeyFields(string tableName, DataStrategy dataStra var list = record as IList>; if (list != null) { - var operation = new UpsertOperation(tableName, list, isResultRequired, keyFieldNames.ToArray(), - errorCallback); + var operation = new UpsertOperation(tableName, list, isResultRequired, null, errorCallback); return dataStrategy.Run.Execute(operation); } else { - var dict = record as IDictionary; - var operation = new UpsertOperation(tableName, dict, isResultRequired, keyFieldNames.ToArray(), + var dict = record as IReadOnlyDictionary; + if (dict == null) + { + dict = new ReadOnlyDictionary(record as IDictionary); + } + var criteria = GetCriteria(keyFieldNames, dict); + var operation = new UpsertOperation(tableName, dict, isResultRequired, + ExpressionHelper.CriteriaDictionaryToExpression(tableName, criteria), errorCallback); return dataStrategy.Run.Execute(operation); } } - private static IEnumerable> GetCriteria(IEnumerable keyFieldNames, IDictionary record) + private static IDictionary GetCriteria(IEnumerable keyFieldNames, IReadOnlyDictionary record) { var criteria = new Dictionary(); diff --git a/Simple.Data/Commands/UpsertCommand.cs b/Simple.Data/Commands/UpsertCommand.cs index 6b3ff881..30553f59 100644 --- a/Simple.Data/Commands/UpsertCommand.cs +++ b/Simple.Data/Commands/UpsertCommand.cs @@ -3,6 +3,7 @@ namespace Simple.Data.Commands using System; using System.Collections; using System.Collections.Generic; + using System.Collections.ObjectModel; using System.Dynamic; using System.Linq; using Extensions; @@ -53,7 +54,7 @@ private static OperationResult UpsertUsingKeys(DataStrategy dataStrategy, Dynami if (key == null) throw new InvalidOperationException(string.Format("No key columns defined for table \"{0}\"",table.GetQualifiedName())); if (key.Count == 0) return dataStrategy.Run.Execute(new InsertOperation(table.GetQualifiedName(), dict, isResultRequired)); var criteria = ExpressionHelper.CriteriaDictionaryToExpression(table.GetQualifiedName(), key); - return dataStrategy.Run.Execute(new UpsertOperation(table.GetQualifiedName(), dict, isResultRequired)); + return dataStrategy.Run.Execute(new UpsertOperation(table.GetQualifiedName(), dict, isResultRequired, criteria)); } internal static object ObjectToDictionary(object obj, IEqualityComparer keyComparer) @@ -61,20 +62,26 @@ internal static object ObjectToDictionary(object obj, IEqualityComparer var dynamicRecord = obj as SimpleRecord; if (dynamicRecord != null) { - return new Dictionary(dynamicRecord, keyComparer); + return obj; + } + + var readOnlyDictionary = obj as IReadOnlyDictionary; + if (readOnlyDictionary != null) + { + return readOnlyDictionary; } var dictionary = obj as IDictionary; if (dictionary != null) { - return dictionary; + return new ReadOnlyDictionary(dictionary); } var list = obj as IEnumerable; if (list != null) { var originals = list.Cast().ToList(); - var dictionaries = originals.Select(o => ObjectToDictionary(o, keyComparer) as IDictionary).Where(o => o != null && o.Count > 0).ToList(); + var dictionaries = originals.Select(o => ObjectToDictionary(o, keyComparer) as IReadOnlyDictionary).Where(o => o != null && o.Count > 0).ToList(); if (originals.Count == dictionaries.Count) return dictionaries; } diff --git a/Simple.Data/Operations/UpsertOperation.cs b/Simple.Data/Operations/UpsertOperation.cs index 82669a5a..14776204 100644 --- a/Simple.Data/Operations/UpsertOperation.cs +++ b/Simple.Data/Operations/UpsertOperation.cs @@ -9,37 +9,37 @@ public class UpsertOperation : IOperation private readonly IEnumerable> _data; private readonly bool _resultRequired; private readonly string _tableName; - private readonly string[] _byFieldNames; + private readonly SimpleExpression _criteria; private readonly ErrorCallback _errorCallback; - public UpsertOperation(string tableName, IDictionary data, bool resultRequired, string[] byFieldNames = null, ErrorCallback errorCallback = null) - : this(tableName, resultRequired, byFieldNames, errorCallback) + public UpsertOperation(string tableName, IDictionary data, bool resultRequired, SimpleExpression criteria = null, ErrorCallback errorCallback = null) + : this(tableName, resultRequired, criteria, errorCallback) { _data = EnumerableEx.Once(new ReadOnlyDictionary(data)); } - public UpsertOperation(string tableName, IReadOnlyDictionary data, bool resultRequired, string[] byFieldNames = null, ErrorCallback errorCallback = null) - : this(tableName, resultRequired, byFieldNames, errorCallback) + public UpsertOperation(string tableName, IReadOnlyDictionary data, bool resultRequired, SimpleExpression criteria = null, ErrorCallback errorCallback = null) + : this(tableName, resultRequired, criteria, errorCallback) { _data = EnumerableEx.Once(data); } - public UpsertOperation(string tableName, IEnumerable> data, bool resultRequired, string[] byFieldNames = null, ErrorCallback errorCallback = null) - : this(tableName, resultRequired, byFieldNames, errorCallback) + public UpsertOperation(string tableName, IEnumerable> data, bool resultRequired, SimpleExpression criteria = null, ErrorCallback errorCallback = null) + : this(tableName, resultRequired, criteria, errorCallback) { _data = data.Select(d => new ReadOnlyDictionary(d)); } - public UpsertOperation(string tableName, bool resultRequired, string[] byFieldNames = null, ErrorCallback errorCallback = null) + public UpsertOperation(string tableName, bool resultRequired, SimpleExpression criteria = null, ErrorCallback errorCallback = null) { _tableName = tableName; _resultRequired = resultRequired; - _byFieldNames = byFieldNames; + _criteria = criteria; _errorCallback = errorCallback ?? ((item, exception) => true) ; } - public UpsertOperation(string tableName, IEnumerable> data, bool resultRequired, string[] byFieldNames = null, ErrorCallback errorCallback = null) - : this(tableName, resultRequired, byFieldNames, errorCallback) + public UpsertOperation(string tableName, IEnumerable> data, bool resultRequired, SimpleExpression criteria = null, ErrorCallback errorCallback = null) + : this(tableName, resultRequired, criteria, errorCallback) { _data = data; } @@ -64,9 +64,9 @@ public ErrorCallback ErrorCallback get { return _errorCallback; } } - public string[] ByFieldNames + public SimpleExpression Criteria { - get { return _byFieldNames; } + get { return _criteria; } } } } \ No newline at end of file From 8b99408ce03447dbf6e63c651f53f4599a254456 Mon Sep 17 00:00:00 2001 From: Mark Rendle Date: Fri, 25 Oct 2013 20:47:38 +0100 Subject: [PATCH 08/15] Eager-loading take 2 --- .../EagerLoadingEnumerableTest.cs | 124 + Simple.Data.Ado.Test/GraphNodeTest.cs | 172 + .../Simple.Data.Ado.Test.csproj | 185 +- Simple.Data.Ado.Test/packages.config | 6 +- Simple.Data.Ado/CollectionGraphNode.cs | 62 + Simple.Data.Ado/GraphMap.cs | 29 + Simple.Data.Ado/GraphNode.cs | 114 + Simple.Data.Ado/Simple.Data.Ado.csproj | 4 + Simple.Data.Ado/SingleRecordGraphNode.cs | 62 + .../Simple.Data.BehaviourTest.csproj | 253 +- Simple.Data.BehaviourTest/packages.config | 6 +- Simple.Data.GraphTest/App.config | 6 + Simple.Data.GraphTest/Graph.mdf | Bin 0 -> 3211264 bytes Simple.Data.GraphTest/GraphLoadTest.cs | 34 + Simple.Data.GraphTest/Graph_log.ldf | Bin 0 -> 802816 bytes Simple.Data.GraphTest/Models/Customer.cs | 52 + .../Properties/AssemblyInfo.cs | 36 + .../Simple.Data.GraphTest.csproj | 118 + Simple.Data.GraphTest/packages.config | 4 + .../Simple.Data.InMemoryTest.csproj | 167 +- Simple.Data.InMemoryTest/packages.config | 6 +- .../Simple.Data.Migrations.Tests.csproj | 5 +- Simple.Data.Migrations.Tests/packages.config | 2 +- .../Simple.Data.SqlCe40Test.csproj | 11 +- Simple.Data.SqlCe40Test/packages.config | 8 +- .../Simple.Data.SqlTest.csproj | 409 +- Simple.Data.SqlTest/SimpleTest.mdf | Bin 3211264 -> 3211264 bytes Simple.Data.SqlTest/SimpleTest_log.ldf | Bin 1638400 -> 1638400 bytes Simple.Data.SqlTest/packages.config | 6 +- .../Simple.Data.TestHelper.csproj | 171 +- Simple.Data.TestHelper/packages.config | 8 +- .../EagerLoadingEnumerableTest.cs | 95 +- .../Simple.Data.UnitTest.csproj | 13 +- Simple.Data.UnitTest/packages.config | 8 +- Simple.Data.sln | 20 +- .../DictionaryEqualityComparer.cs | 1 + .../NUnit.2.6.3.nuspec} | 4 +- .../lib/nunit.framework.xml | 12753 ++++++++-------- .../{NUnit.2.6.2 => NUnit.2.6.3}/license.txt | 30 +- packages/repositories.config | 2 +- 40 files changed, 7879 insertions(+), 7107 deletions(-) create mode 100644 Simple.Data.Ado.Test/EagerLoadingEnumerableTest.cs create mode 100644 Simple.Data.Ado.Test/GraphNodeTest.cs create mode 100644 Simple.Data.Ado/CollectionGraphNode.cs create mode 100644 Simple.Data.Ado/GraphMap.cs create mode 100644 Simple.Data.Ado/GraphNode.cs create mode 100644 Simple.Data.Ado/SingleRecordGraphNode.cs create mode 100644 Simple.Data.GraphTest/App.config create mode 100644 Simple.Data.GraphTest/Graph.mdf create mode 100644 Simple.Data.GraphTest/GraphLoadTest.cs create mode 100644 Simple.Data.GraphTest/Graph_log.ldf create mode 100644 Simple.Data.GraphTest/Models/Customer.cs create mode 100644 Simple.Data.GraphTest/Properties/AssemblyInfo.cs create mode 100644 Simple.Data.GraphTest/Simple.Data.GraphTest.csproj create mode 100644 Simple.Data.GraphTest/packages.config rename packages/{NUnit.2.6.2/NUnit.2.6.2.nuspec => NUnit.2.6.3/NUnit.2.6.3.nuspec} (91%) rename packages/{NUnit.2.6.2 => NUnit.2.6.3}/lib/nunit.framework.xml (95%) rename packages/{NUnit.2.6.2 => NUnit.2.6.3}/license.txt (89%) diff --git a/Simple.Data.Ado.Test/EagerLoadingEnumerableTest.cs b/Simple.Data.Ado.Test/EagerLoadingEnumerableTest.cs new file mode 100644 index 00000000..a599f319 --- /dev/null +++ b/Simple.Data.Ado.Test/EagerLoadingEnumerableTest.cs @@ -0,0 +1,124 @@ +namespace Simple.Data.Ado.Test +{ + using System.Collections.Generic; + using System.Linq; + using NUnit.Framework; + + [TestFixture] + public class EagerLoadingEnumerableTest + { + [Test] + public void GroupsObjectAsChildItem() + { + var dict = new Dictionary + { + {"foo", "Foo1"}, + {"__with1__bar__quux", "Quux1"} + }; + + var test = new EagerLoadingEnumerable(new[] { dict }).ToList(); + Assert.AreEqual(1, test.Count); + var actual = test[0]; + + Assert.AreEqual("Foo1", actual["foo"]); + var bar = actual["bar"] as IDictionary; + Assert.NotNull(bar); + Assert.AreEqual("Quux1", bar["quux"]); + } + + [Test] + public void GroupsMultipleObjectsAsChildItems() + { + var dicts = new[] + { + new Dictionary + { + {"foo", "Foo1"}, + {"__with1__bar__quux", "Quux1"}, + {"__with1__wibble__wobble", "Wobble1"} + }, + }; + + var test = new EagerLoadingEnumerable(dicts).ToList(); + Assert.AreEqual(1, test.Count); + var actual = test[0]; + + Assert.AreEqual("Foo1", actual["foo"]); + var bar = actual["bar"] as IDictionary; + Assert.NotNull(bar); + Assert.AreEqual("Quux1", bar["quux"]); + var wibble = actual["wibble"] as IDictionary; + Assert.NotNull(wibble); + Assert.AreEqual("Wobble1", wibble["wobble"]); + } + + [Test] + public void GroupsMultipleObjectsAsChildItemLists() + { + var dicts = new[] + { + new Dictionary + { + {"foo", "Foo1"}, + {"__withn__bar__quux", "Quux1"}, + {"__withn__wibble__wobble", "Wobble1"} + }, + new Dictionary + { + {"foo", "Foo1"}, + {"__withn__bar__quux", "Quux1"}, + {"__withn__wibble__wobble", "Wobble2"} + }, + new Dictionary + { + {"foo", "Foo1"}, + {"__withn__bar__quux", "Quux2"}, + {"__withn__wibble__wobble", "Wobble1"} + }, + new Dictionary + { + {"foo", "Foo1"}, + {"__withn__bar__quux", "Quux2"}, + {"__withn__wibble__wobble", "Wobble2"} + }, + }; + + var test = new EagerLoadingEnumerable(dicts).ToList(); + Assert.AreEqual(1, test.Count); + var actual = test[0]; + + Assert.AreEqual("Foo1", actual["foo"]); + var bar = actual["bar"] as IList>; + Assert.NotNull(bar); + Assert.AreEqual("Quux1", bar[0]["quux"]); + Assert.AreEqual("Quux2", bar[1]["quux"]); + var wibble = actual["wibble"] as IList>; + Assert.NotNull(wibble); + Assert.AreEqual("Wobble1", wibble[0]["wobble"]); + Assert.AreEqual("Wobble2", wibble[1]["wobble"]); + } + + //[Test] + public void NestsChildCollections() + { + var dict = new Dictionary + { + {"foo", "Foo1"}, + {"__with1__bar__quux", "Quux1"}, + {"__with1__bar__withn__wibble__wobble", "Wobble1"}, + }; + + var test = new EagerLoadingEnumerable(new[] { dict }).ToList(); + Assert.AreEqual(1, test.Count); + var actual = test[0]; + + Assert.AreEqual("Foo1", actual["foo"]); + var bar = actual["bar"] as IDictionary; + Assert.NotNull(bar); + Assert.AreEqual("Quux1", bar["quux"]); + + object obj; + Assert.IsTrue(bar.TryGetValue("wibble", out obj)); + } + } +} \ No newline at end of file diff --git a/Simple.Data.Ado.Test/GraphNodeTest.cs b/Simple.Data.Ado.Test/GraphNodeTest.cs new file mode 100644 index 00000000..f30b654b --- /dev/null +++ b/Simple.Data.Ado.Test/GraphNodeTest.cs @@ -0,0 +1,172 @@ +namespace Simple.Data.Ado.Test +{ + using System; + using System.Collections.Generic; + using NUnit.Framework; + + [TestFixture] + public class GraphNodeTest + { + [Test] + public void FindsChildNode() + { + var root = new SingleRecordGraphNode(""); + var path = new[] {"with1", "foo", "bar"}; + var actual = root.Find(path); + Assert.IsNotNull(actual); + } + + [Test] + public void FindsNestedChildNode() + { + var root = new SingleRecordGraphNode(""); + var path = new[] {"with1", "foo", "with1", "bar", "quux"}; + var actual = root.Find(path); + Assert.IsNotNull(actual); + } + + [Test] + public void ChildNodeIsSingleForWith1() + { + var root = new SingleRecordGraphNode(""); + var path = new[] {"with1", "foo", "bar"}; + var actual = root.Find(path); + Assert.IsInstanceOf(actual); + } + + [Test] + public void ChildNodeIsCollectionForWithN() + { + var root = new SingleRecordGraphNode(""); + var path = new[] {"withn", "foo", "bar"}; + var actual = root.Find(path); + Assert.IsInstanceOf(actual); + } + + [Test] + public void MapsRowWithSingleChild() + { + var root = new SingleRecordGraphNode(""); + root.AddField("id"); + const string path = "__with1__foo__bar"; + root.AddNode(path); + + var dict = new Dictionary + { + {"id", 1}, + {path, "Pass"} + }; + + root.SetFields(dict); + + var actual = root.GetResult(); + Assert.AreEqual(1, actual["id"]); + var child = (IDictionary) actual["foo"]; + Assert.AreEqual("Pass", child["bar"]); + } + + [Test] + public void DoesNotCreateRowForAllNullValues() + { + var root = new SingleRecordGraphNode(""); + root.AddField("id"); + const string path = "__with1__foo__bar"; + root.AddNode(path); + + var dict = new Dictionary + { + {"id", 1}, + {path, null} + }; + + root.SetFields(dict); + + var actual = root.GetResult(); + Assert.AreEqual(1, actual["id"]); + Assert.False(actual.ContainsKey("foo")); + } + + [Test] + public void MapsRowWithNChild() + { + var root = new SingleRecordGraphNode(""); + root.AddField("id"); + const string path = "__withn__foo__bar"; + root.AddNode(path); + + var dict = new Dictionary + { + {"id", 1}, + {path, "Pass"} + }; + + root.SetFields(dict); + + var actual = root.GetResult(); + Assert.AreEqual(1, actual["id"]); + var child = (IList>)actual["foo"]; + Assert.AreEqual("Pass", child[0]["bar"]); + } + + [Test] + public void MapsRowWithNChildren() + { + var root = new SingleRecordGraphNode(""); + root.AddField("id"); + const string path = "__withn__foo__bar"; + root.AddNode(path); + + root.SetFields(Dict("id", 1, path, "Pass")); + root.SetFields(Dict("id", 1, path, "Pass2")); + + var actual = root.GetResult(); + Assert.AreEqual(1, actual["id"]); + var child = (IList>)actual["foo"]; + Assert.AreEqual("Pass", child[0]["bar"]); + Assert.AreEqual("Pass2", child[1]["bar"]); + } + + [Test] + public void MapsRowWithNChildrenWithSingleChild() + { + var root = new SingleRecordGraphNode(""); + root.AddField("id"); + const string foo = "__withn__foo__bar"; + const string wib = "__withn__foo__with1__wib__wob"; + root.AddNode(foo); + root.AddNode(wib); + + root.SetFields(Dict("id", 1, foo, "Pass", wib, "WibPass")); + root.SetFields(Dict("id", 1, foo, "Pass2", wib, "WibPass2")); + + var actual = root.GetResult(); + Assert.AreEqual(1, actual["id"]); + var child = (IList>)actual["foo"]; + Assert.AreEqual("Pass", child[0]["bar"]); + var childWib = (IDictionary) child[0]["wib"]; + Assert.AreEqual("WibPass", childWib["wob"]); + Assert.AreEqual("Pass2", child[1]["bar"]); + childWib = (IDictionary) child[1]["wib"]; + Assert.AreEqual("WibPass2", childWib["wob"]); + } + + public static IDictionary Dict(params object[] data) + { + var dict = new Dictionary(); + dict.AddRow(data); + return dict; + } + } + + static class Hack + { + public static void AddRow(this IDictionary dictionary, params object[] data) + { + if (data.Length % 2 != 0) throw new InvalidOperationException("Odd number of parameters."); + for (int i = 0; i < data.Length; i+=2) + { + dictionary[data[i].ToString()] = data[i + 1]; + } + } + } +} \ No newline at end of file diff --git a/Simple.Data.Ado.Test/Simple.Data.Ado.Test.csproj b/Simple.Data.Ado.Test/Simple.Data.Ado.Test.csproj index 693957ad..d747534c 100644 --- a/Simple.Data.Ado.Test/Simple.Data.Ado.Test.csproj +++ b/Simple.Data.Ado.Test/Simple.Data.Ado.Test.csproj @@ -1,95 +1,92 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {96C623FD-869E-4DCE-98A1-17075EE384F9} - Library - Properties - Simple.Data.Ado.Test - Simple.Data.Ado.Test - 512 - v4.5 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - - - - - - - - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll - - - ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll - - - - - - - - - - - - - - - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} - Simple.Data.Ado - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - - - - - + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {96C623FD-869E-4DCE-98A1-17075EE384F9} + Library + Properties + Simple.Data.Ado.Test + Simple.Data.Ado.Test + 512 + v4.5 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + False + ..\packages\NUnit.2.6.3\lib\nunit.framework.dll + + + + + + + + + + + + + + + + + + + + + + + + + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} + Simple.Data.Ado + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + + + + + \ No newline at end of file diff --git a/Simple.Data.Ado.Test/packages.config b/Simple.Data.Ado.Test/packages.config index 0c821784..d4e241a2 100644 --- a/Simple.Data.Ado.Test/packages.config +++ b/Simple.Data.Ado.Test/packages.config @@ -1,4 +1,4 @@ - - - + + + \ No newline at end of file diff --git a/Simple.Data.Ado/CollectionGraphNode.cs b/Simple.Data.Ado/CollectionGraphNode.cs new file mode 100644 index 00000000..58603304 --- /dev/null +++ b/Simple.Data.Ado/CollectionGraphNode.cs @@ -0,0 +1,62 @@ +namespace Simple.Data.Ado +{ + using System; + using System.Collections.Generic; + using System.Linq; + using QueryPolyfills; + + class CollectionGraphNode : GraphNode + { + private IList> _data = new List>(); + private IDictionary _current; + + public CollectionGraphNode(string name) : base(name) + { + throw new NotImplementedException(); + } + + public CollectionGraphNode(string name, GraphNode parent) : base(name, parent) + { + } + + public override void SetFields(IDictionary data) + { + var newData = CreateNewDataDictionary(data); + if (newData == null) return; + if (!_data.Any(d => RecordsContainSameData(d, newData))) + { + _current = newData; + _data.Add(newData); + } + + foreach (var child in Children) + { + child.SetFields(data); + } + } + + protected internal override void OnParentChanged() + { + _data = new List>(); + Parent.SetField(Name, _data); + _current = null; + + SendOnParentChanged(); + } + + protected internal override void SetField(string name, object value) + { + if (_current == null) + { + _current = new Dictionary(); + _data.Add(_current); + } + _current[name] = value; + } + + public override IDictionary GetResult() + { + throw new InvalidOperationException("Calling GetResult is not valid on a Collection node."); + } + } +} \ No newline at end of file diff --git a/Simple.Data.Ado/GraphMap.cs b/Simple.Data.Ado/GraphMap.cs new file mode 100644 index 00000000..85835419 --- /dev/null +++ b/Simple.Data.Ado/GraphMap.cs @@ -0,0 +1,29 @@ +namespace Simple.Data.Ado +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Text; + + class GraphMap + { + private static readonly string[] Delimiter = {"__"}; + private readonly Dictionary _nodes = new Dictionary(StringComparer.OrdinalIgnoreCase); + public static GraphNode Create(ICollection keys) + { + var root = new SingleRecordGraphNode(""); + + foreach (var rootKey in keys.Where(k => !k.StartsWith("__with"))) + { + root.AddField(rootKey); + } + + var childKeys = keys.Where(k => k.StartsWith("__with")) + .OrderBy(k => k.Split(Delimiter, StringSplitOptions.RemoveEmptyEntries).Length) + .ThenBy(k => k); + + return root; + } + + } +} \ No newline at end of file diff --git a/Simple.Data.Ado/GraphNode.cs b/Simple.Data.Ado/GraphNode.cs new file mode 100644 index 00000000..1d12ee85 --- /dev/null +++ b/Simple.Data.Ado/GraphNode.cs @@ -0,0 +1,114 @@ +namespace Simple.Data.Ado +{ + using System; + using System.Collections.Generic; + using System.Linq; + + abstract class GraphNode + { + private static readonly string[] Delimiter = {"__"}; + private readonly GraphNode _parent; + private readonly string _name; + + protected string Name + { + get { return _name; } + } + + private readonly Dictionary _fields = new Dictionary(); + + protected Dictionary Fields + { + get { return _fields; } + } + + private readonly List _children = new List(); + + public List Children + { + get { return _children; } + } + + public GraphNode Parent + { + get { return _parent; } + } + + protected GraphNode(string name) : this(name, null) + { + } + + protected GraphNode(string name, GraphNode parent) + { + _parent = parent; + _name = name; + } + + public void AddField(string field) + { + _fields.Add(field, field.Split(Delimiter, StringSplitOptions.RemoveEmptyEntries).Last()); + } + + public abstract void SetFields(IDictionary data); + + public void AddNode(string path) + { + var node = Find(path.Split(Delimiter, StringSplitOptions.RemoveEmptyEntries)); + node.AddField(path); + } + + public GraphNode Find(string[] path, int index = 0) + { + if (path.Length - 1 == index) return this; + var child = _children.FirstOrDefault(n => n._name.Equals(path[index + 1])); + if (child == null) + { + child = path[index].Equals("with1") + ? (GraphNode) new SingleRecordGraphNode(path[index + 1], this) + : new CollectionGraphNode(path[index + 1], this); + _children.Add(child); + } + return child.Find(path, index + 2); + } + + protected internal abstract void OnParentChanged(); + + protected internal abstract void SetField(string name, object value); + + public abstract IDictionary GetResult(); + + protected IDictionary CreateNewDataDictionary(IDictionary data) + { + bool anyValues = false; + IDictionary newData = new Dictionary(HomogenizedEqualityComparer.DefaultInstance); + foreach (var field in Fields) + { + object obj; + data.TryGetValue(field.Key, out obj); + anyValues = (newData[field.Value] = obj) != null || anyValues; + } + return anyValues ? newData : null; + } + + protected bool RecordsContainSameData(IDictionary a, IDictionary b) + { + foreach (var field in _fields.Values) + { + object aObj; + object bObj; + if (a.TryGetValue(field, out aObj) != b.TryGetValue(field, out bObj)) return false; + if (!Equals(aObj, bObj)) return false; + } + + return true; + } + + protected void SendOnParentChanged() + { + foreach (var child in Children) + { + child.OnParentChanged(); + } + } + } +} \ No newline at end of file diff --git a/Simple.Data.Ado/Simple.Data.Ado.csproj b/Simple.Data.Ado/Simple.Data.Ado.csproj index 61f79c6a..cc32b568 100644 --- a/Simple.Data.Ado/Simple.Data.Ado.csproj +++ b/Simple.Data.Ado/Simple.Data.Ado.csproj @@ -103,6 +103,10 @@ + + + + diff --git a/Simple.Data.Ado/SingleRecordGraphNode.cs b/Simple.Data.Ado/SingleRecordGraphNode.cs new file mode 100644 index 00000000..f6c0e77f --- /dev/null +++ b/Simple.Data.Ado/SingleRecordGraphNode.cs @@ -0,0 +1,62 @@ +namespace Simple.Data.Ado +{ + using System.Collections.Generic; + using QueryPolyfills; + + class SingleRecordGraphNode : GraphNode + { + private IDictionary _data; + public SingleRecordGraphNode(string name) : base(name) + { + } + + public SingleRecordGraphNode(string name, GraphNode parent) : base(name, parent) + { + } + + public override void SetFields(IDictionary data) + { + SetNewData(data); + SendToChildren(data); + } + + private void SendToChildren(IDictionary data) + { + foreach (var child in Children) + { + child.SetFields(data); + } + } + + private void SetNewData(IDictionary data) + { + var newData = CreateNewDataDictionary(data); + if (newData == null) return; + if (_data == null || !RecordsContainSameData(_data, newData)) + { + _data = newData; + if (Parent != null) + { + Parent.SetField(Name, _data); + } + SendOnParentChanged(); + } + } + + protected internal override void OnParentChanged() + { + _data = null; + SendOnParentChanged(); + } + + protected internal override void SetField(string name, object value) + { + _data[name] = value; + } + + public override IDictionary GetResult() + { + return _data; + } + } +} \ No newline at end of file diff --git a/Simple.Data.BehaviourTest/Simple.Data.BehaviourTest.csproj b/Simple.Data.BehaviourTest/Simple.Data.BehaviourTest.csproj index ebcf6ca6..706ec9da 100644 --- a/Simple.Data.BehaviourTest/Simple.Data.BehaviourTest.csproj +++ b/Simple.Data.BehaviourTest/Simple.Data.BehaviourTest.csproj @@ -1,130 +1,125 @@ - - - - Debug - AnyCPU - - - 2.0 - {70536BA8-AF0D-46F3-B04C-45177F56B320} - Library - Properties - Simple.Data.IntegrationTest - Simple.Data.IntegrationTest - 512 - v4.5 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - - - - 3.5 - - - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll - - - ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll - - - - - - False - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} - Simple.Data.Ado - - - {292611f6-bbbd-492d-891c-0d9fb4bf5433} - Simple.Data.Mocking - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - - - - - - - + + + + Debug + AnyCPU + + + 2.0 + {70536BA8-AF0D-46F3-B04C-45177F56B320} + Library + Properties + Simple.Data.IntegrationTest + Simple.Data.IntegrationTest + 512 + v4.5 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + False + ..\packages\NUnit.2.6.3\lib\nunit.framework.dll + + + + 3.5 + + + + + + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} + Simple.Data.Ado + + + {292611f6-bbbd-492d-891c-0d9fb4bf5433} + Simple.Data.Mocking + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + + + + + + + \ No newline at end of file diff --git a/Simple.Data.BehaviourTest/packages.config b/Simple.Data.BehaviourTest/packages.config index 0c821784..d4e241a2 100644 --- a/Simple.Data.BehaviourTest/packages.config +++ b/Simple.Data.BehaviourTest/packages.config @@ -1,4 +1,4 @@ - - - + + + \ No newline at end of file diff --git a/Simple.Data.GraphTest/App.config b/Simple.Data.GraphTest/App.config new file mode 100644 index 00000000..ba40c2f7 --- /dev/null +++ b/Simple.Data.GraphTest/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Simple.Data.GraphTest/Graph.mdf b/Simple.Data.GraphTest/Graph.mdf new file mode 100644 index 0000000000000000000000000000000000000000..586310d59cf076be2e9215a444e18767687b8d53 GIT binary patch literal 3211264 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

I{64AyIFu~P;U0E-s)p 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⪙v880B~}- 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�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򐺈n`^wek^a2fG%+wS1qzH5`}M2NDBbDQD$l`yIBH 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%0ATYtnoSZ-<6lQfFI6% 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 Orders { get; set; } + } + + public class Order + { + public int Id { get; set; } + public int CustomerId { get; set; } + public DateTimeOffset Date { get; set; } + public List Items { get; set; } + } + + public class OrderItem + { + public int Id { get; set; } + public int OrderId { get; set; } + public int ProductId { get; set; } + public int Quantity { get; set; } + } + + public class Product + { + public int Id { get; set; } + public string Name { get; set; } + public List Prices { get; set; } + } + + public class ProductPrice + { + public int Id { get; set; } + public int ProductId { get; set; } + public int RegionId { get; set; } + public Region Region { get; set; } + public decimal Price { get; set; } + } + + public class Region + { + public int Id { get; set; } + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/Simple.Data.GraphTest/Properties/AssemblyInfo.cs b/Simple.Data.GraphTest/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..b9ffe821 --- /dev/null +++ b/Simple.Data.GraphTest/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Simple.Data.GraphTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Simple.Data.GraphTest")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("ab512692-6493-4b48-afa5-4d6efa70f9a6")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Simple.Data.GraphTest/Simple.Data.GraphTest.csproj b/Simple.Data.GraphTest/Simple.Data.GraphTest.csproj new file mode 100644 index 00000000..ea03f38c --- /dev/null +++ b/Simple.Data.GraphTest/Simple.Data.GraphTest.csproj @@ -0,0 +1,118 @@ + + + + + Debug + AnyCPU + {3F84BDCB-E1DF-4447-85FF-7A4B28B42326} + Library + Properties + Simple.Data.GraphTest + Simple.Data.GraphTest + v4.5 + 512 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\NUnit.2.6.3\lib\nunit.framework.dll + + + + + + + + + + + + + + + + + {ecc2d7db-ec7f-44b6-b09f-5b471c629685} + Simple.Data.Ado + + + {e24f1c0f-3dcd-4be5-9a6e-78ef6cb392a1} + Simple.Data.SqlServer + + + {148cee80-2e84-4abd-b5ab-20415b2bbd21} + Simple.Data + + + + + Designer + + + + + + Always + + + Always + Graph.mdf + + + + + False + Microsoft .NET Framework 4.5 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + + + \ No newline at end of file diff --git a/Simple.Data.GraphTest/packages.config b/Simple.Data.GraphTest/packages.config new file mode 100644 index 00000000..d4e241a2 --- /dev/null +++ b/Simple.Data.GraphTest/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Simple.Data.InMemoryTest/Simple.Data.InMemoryTest.csproj b/Simple.Data.InMemoryTest/Simple.Data.InMemoryTest.csproj index 189b0804..4c3819f9 100644 --- a/Simple.Data.InMemoryTest/Simple.Data.InMemoryTest.csproj +++ b/Simple.Data.InMemoryTest/Simple.Data.InMemoryTest.csproj @@ -1,87 +1,82 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {1B6A87C0-4ACA-4411-8879-844537A52126} - Library - Properties - Simple.Data.InMemoryTest - Simple.Data.InMemoryTest - 512 - v4.5 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - - - - - - - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll - - - ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll - - - - - - - - - - - - - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - - + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {1B6A87C0-4ACA-4411-8879-844537A52126} + Library + Properties + Simple.Data.InMemoryTest + Simple.Data.InMemoryTest + 512 + v4.5 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + False + ..\packages\NUnit.2.6.3\lib\nunit.framework.dll + + + + + + + + + + + + + + + + + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + + + + + \ No newline at end of file diff --git a/Simple.Data.InMemoryTest/packages.config b/Simple.Data.InMemoryTest/packages.config index 0c821784..d4e241a2 100644 --- a/Simple.Data.InMemoryTest/packages.config +++ b/Simple.Data.InMemoryTest/packages.config @@ -1,4 +1,4 @@ - - - + + + \ No newline at end of file diff --git a/Simple.Data.Migrations.Tests/Simple.Data.Migrations.Tests.csproj b/Simple.Data.Migrations.Tests/Simple.Data.Migrations.Tests.csproj index 0833795a..ce83d1cf 100644 --- a/Simple.Data.Migrations.Tests/Simple.Data.Migrations.Tests.csproj +++ b/Simple.Data.Migrations.Tests/Simple.Data.Migrations.Tests.csproj @@ -30,8 +30,9 @@ 4 - - ..\packages\NUnit.2.6.2\lib\nunit.framework.dll + + False + ..\packages\NUnit.2.6.3\lib\nunit.framework.dll diff --git a/Simple.Data.Migrations.Tests/packages.config b/Simple.Data.Migrations.Tests/packages.config index daee5f55..d4e241a2 100644 --- a/Simple.Data.Migrations.Tests/packages.config +++ b/Simple.Data.Migrations.Tests/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/Simple.Data.SqlCe40Test/Simple.Data.SqlCe40Test.csproj b/Simple.Data.SqlCe40Test/Simple.Data.SqlCe40Test.csproj index b05d56b6..2c9f3984 100644 --- a/Simple.Data.SqlCe40Test/Simple.Data.SqlCe40Test.csproj +++ b/Simple.Data.SqlCe40Test/Simple.Data.SqlCe40Test.csproj @@ -51,14 +51,9 @@ - - ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll - - - ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll + + False + ..\packages\NUnit.2.6.3\lib\nunit.framework.dll diff --git a/Simple.Data.SqlCe40Test/packages.config b/Simple.Data.SqlCe40Test/packages.config index 0288ae3c..12586193 100644 --- a/Simple.Data.SqlCe40Test/packages.config +++ b/Simple.Data.SqlCe40Test/packages.config @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/Simple.Data.SqlTest/Simple.Data.SqlTest.csproj b/Simple.Data.SqlTest/Simple.Data.SqlTest.csproj index 8b042d1b..3580eda8 100644 --- a/Simple.Data.SqlTest/Simple.Data.SqlTest.csproj +++ b/Simple.Data.SqlTest/Simple.Data.SqlTest.csproj @@ -1,208 +1,203 @@ - - - - Debug - AnyCPU - - - 2.0 - {EFA5B19B-D24F-497E-AB48-8588ABFD1D01} - Library - Properties - Simple.Data.SqlTest - Simple.Data.SqlTest - 512 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - v4.5 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE;MONO - prompt - 4 - false - - - - - False - ..\Assemblies\Microsoft.SqlServer.Types.dll - True - - - - 3.5 - - - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll - - - ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll - - - - - False - - - - - - - - - - - - - - - - - - - - True - True - Resources.resx - - - True - True - Settings.settings - - - - - - - - - - - - - - - - - - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} - Simple.Data.Ado - - - {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1} - Simple.Data.SqlServer - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - {7DAB2F13-0392-435E-A934-4567266714BF} - Simple.Data.TestHelper - - - - - Designer - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - - - ResXFileCodeGenerator - Resources.Designer.cs - - - - - - - - - - - Always - - - Always - SimpleTest.mdf - - - - - False - Microsoft .NET Framework 4 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - False - Windows Installer 4.5 - true - - - - + + + + Debug + AnyCPU + + + 2.0 + {EFA5B19B-D24F-497E-AB48-8588ABFD1D01} + Library + Properties + Simple.Data.SqlTest + Simple.Data.SqlTest + 512 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + v4.5 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE;MONO + prompt + 4 + false + + + + + False + ..\Assemblies\Microsoft.SqlServer.Types.dll + True + + + False + ..\packages\NUnit.2.6.3\lib\nunit.framework.dll + + + + 3.5 + + + + + + + False + + + + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + True + True + Settings.settings + + + + + + + + + + + + + + + + + + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} + Simple.Data.Ado + + + {E24F1C0F-3DCD-4BE5-9A6E-78EF6CB392A1} + Simple.Data.SqlServer + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + {7DAB2F13-0392-435E-A934-4567266714BF} + Simple.Data.TestHelper + + + + + Designer + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + + + + Always + + + Always + SimpleTest.mdf + + + + + False + Microsoft .NET Framework 4 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + Windows Installer 4.5 + true + + + + \ No newline at end of file diff --git a/Simple.Data.SqlTest/SimpleTest.mdf b/Simple.Data.SqlTest/SimpleTest.mdf index 1a7cf76209ce519cde55959230ebb80ce936fbd1..ebc49d8f9bd49a1b86be8af24b6ce1507b2068d2 100644 GIT binary patch delta 308 zcmZ9>w++Hj6op|wlXEf#Oz<-~2hlPG15mhN0TytBsFAmzLZV;+3gjV>n1KP{M@R^9 z?){o`9Ooh&998K`PjhvtYg?fx{5Qtpad2nX`pK5wQ``To^NoM~UeC4^D`CB7mHUlL z_vsa7xw~5eDtz!GfFME$BZ4Smh$Dd{Qb;3%EOOA0hmHb@D8WD(6;x4!2?+~zG|)r~ VZFJB@4}ADO^y}Z~=E5z!yQHprNFQI0O=> zpoHHbBu4r)()^kz+R6w^LrEFyof+H8wj3$M5w~$RqagnI_gA6XovaDvE{fmzY?{<{ zsN|p2Np^*C`@QU#+x0HQcyZ7Y22w~PgDi5$;{gRc;t54O;{_#@QGp2yRoJNE6?Hgh ipa~am@SvdKqlGr!@qrFL@r3~2=%R-{2J3?!diyi4tYn7( diff --git a/Simple.Data.SqlTest/SimpleTest_log.ldf b/Simple.Data.SqlTest/SimpleTest_log.ldf index 40df1ea1545b7819c155f0c26b3ed8da66be7d59..b96682e4690f68a15892c7b83b9702daa3d865c7 100644 GIT binary patch delta 11306 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 SQoF)kYFAoUdRInQ=Kli1I)A|c diff --git a/Simple.Data.SqlTest/packages.config b/Simple.Data.SqlTest/packages.config index 0c821784..d4e241a2 100644 --- a/Simple.Data.SqlTest/packages.config +++ b/Simple.Data.SqlTest/packages.config @@ -1,4 +1,4 @@ - - - + + + \ No newline at end of file diff --git a/Simple.Data.TestHelper/Simple.Data.TestHelper.csproj b/Simple.Data.TestHelper/Simple.Data.TestHelper.csproj index 32b7ad7c..86501693 100644 --- a/Simple.Data.TestHelper/Simple.Data.TestHelper.csproj +++ b/Simple.Data.TestHelper/Simple.Data.TestHelper.csproj @@ -1,89 +1,84 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {7DAB2F13-0392-435E-A934-4567266714BF} - Library - Properties - Simple.Data.TestHelper - Simple.Data.TestHelper - 512 - v4.5 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - - - - - - - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll - - - ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll - - - - - - - - - - - - - {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} - Simple.Data.Ado - - - {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} - Simple.Data - - - - + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {7DAB2F13-0392-435E-A934-4567266714BF} + Library + Properties + Simple.Data.TestHelper + Simple.Data.TestHelper + 512 + v4.5 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + False + ..\packages\NUnit.2.6.3\lib\nunit.framework.dll + + + + + + + + + + + + + + + + + + + + {ECC2D7DB-EC7F-44B6-B09F-5B471C629685} + Simple.Data.Ado + + + {148CEE80-2E84-4ABD-B5AB-20415B2BBD21} + Simple.Data + + + + \ No newline at end of file diff --git a/Simple.Data.TestHelper/packages.config b/Simple.Data.TestHelper/packages.config index ff9a5c67..967a6323 100644 --- a/Simple.Data.TestHelper/packages.config +++ b/Simple.Data.TestHelper/packages.config @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/Simple.Data.UnitTest/EagerLoadingEnumerableTest.cs b/Simple.Data.UnitTest/EagerLoadingEnumerableTest.cs index 9ef11fba..af07a7d3 100644 --- a/Simple.Data.UnitTest/EagerLoadingEnumerableTest.cs +++ b/Simple.Data.UnitTest/EagerLoadingEnumerableTest.cs @@ -5,98 +5,5 @@ using Ado; using NUnit.Framework; - [TestFixture] - public class EagerLoadingEnumerableTest - { - [Test] - public void GroupsObjectAsChildItem() - { - var dict = new Dictionary - { - {"foo", "Foo1"}, - {"__with1__bar__quux", "Quux1"} - }; - - var test = new EagerLoadingEnumerable(new[] {dict}).ToList(); - Assert.AreEqual(1, test.Count); - var actual = test[0]; - - Assert.AreEqual("Foo1", actual["foo"]); - var bar = actual["bar"] as IDictionary; - Assert.NotNull(bar); - Assert.AreEqual("Quux1", bar["quux"]); - } - - [Test] - public void GroupsMultipleObjectsAsChildItems() - { - var dicts = new[] - { - new Dictionary - { - {"foo", "Foo1"}, - {"__with1__bar__quux", "Quux1"}, - {"__with1__wibble__wobble", "Wobble1"} - }, - }; - - var test = new EagerLoadingEnumerable(dicts).ToList(); - Assert.AreEqual(1, test.Count); - var actual = test[0]; - - Assert.AreEqual("Foo1", actual["foo"]); - var bar = actual["bar"] as IDictionary; - Assert.NotNull(bar); - Assert.AreEqual("Quux1", bar["quux"]); - var wibble = actual["wibble"] as IDictionary; - Assert.NotNull(wibble); - Assert.AreEqual("Wobble1", wibble["wobble"]); - } - - [Test] - public void GroupsMultipleObjectsAsChildItemLists() - { - var dicts = new[] - { - new Dictionary - { - {"foo", "Foo1"}, - {"__withn__bar__quux", "Quux1"}, - {"__withn__wibble__wobble", "Wobble1"} - }, - new Dictionary - { - {"foo", "Foo1"}, - {"__withn__bar__quux", "Quux1"}, - {"__withn__wibble__wobble", "Wobble2"} - }, - new Dictionary - { - {"foo", "Foo1"}, - {"__withn__bar__quux", "Quux2"}, - {"__withn__wibble__wobble", "Wobble1"} - }, - new Dictionary - { - {"foo", "Foo1"}, - {"__withn__bar__quux", "Quux2"}, - {"__withn__wibble__wobble", "Wobble2"} - }, - }; - - var test = new EagerLoadingEnumerable(dicts).ToList(); - Assert.AreEqual(1, test.Count); - var actual = test[0]; - - Assert.AreEqual("Foo1", actual["foo"]); - var bar = actual["bar"] as IList>; - Assert.NotNull(bar); - Assert.AreEqual("Quux1", bar[0]["quux"]); - Assert.AreEqual("Quux2", bar[1]["quux"]); - var wibble = actual["wibble"] as IList>; - Assert.NotNull(wibble); - Assert.AreEqual("Wobble1", wibble[0]["wobble"]); - Assert.AreEqual("Wobble2", wibble[1]["wobble"]); - } - } + } \ No newline at end of file diff --git a/Simple.Data.UnitTest/Simple.Data.UnitTest.csproj b/Simple.Data.UnitTest/Simple.Data.UnitTest.csproj index 465ae7e6..5b7cd659 100644 --- a/Simple.Data.UnitTest/Simple.Data.UnitTest.csproj +++ b/Simple.Data.UnitTest/Simple.Data.UnitTest.csproj @@ -45,6 +45,10 @@ + + False + ..\packages\NUnit.2.6.3\lib\nunit.framework.dll + @@ -58,15 +62,6 @@ ..\packages\Trespasser.1.1\lib\net40\Trespasser.dll - - ..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll - - - ..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll - - - ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll - diff --git a/Simple.Data.UnitTest/packages.config b/Simple.Data.UnitTest/packages.config index dca05329..5a15af43 100644 --- a/Simple.Data.UnitTest/packages.config +++ b/Simple.Data.UnitTest/packages.config @@ -1,5 +1,5 @@ - - - - + + + + \ No newline at end of file diff --git a/Simple.Data.sln b/Simple.Data.sln index 7ff2b09c..dd88149a 100644 --- a/Simple.Data.sln +++ b/Simple.Data.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.20827.3 +VisualStudioVersion = 12.0.21005.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data", "Simple.Data\Simple.Data.csproj", "{148CEE80-2E84-4ABD-B5AB-20415B2BBD21}" EndProject @@ -59,6 +59,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.Migrations", "S EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.Migrations.Tests", "Simple.Data.Migrations.Tests\Simple.Data.Migrations.Tests.csproj", "{9F110A91-DC67-48C1-894D-B36650F38DE1}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple.Data.GraphTest", "Simple.Data.GraphTest\Simple.Data.GraphTest.csproj", "{3F84BDCB-E1DF-4447-85FF-7A4B28B42326}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -327,6 +329,21 @@ Global {9F110A91-DC67-48C1-894D-B36650F38DE1}.Release-Mono|Mixed Platforms.ActiveCfg = Release|Any CPU {9F110A91-DC67-48C1-894D-B36650F38DE1}.Release-Mono|Mixed Platforms.Build.0 = Release|Any CPU {9F110A91-DC67-48C1-894D-B36650F38DE1}.Release-Mono|x86.ActiveCfg = Release|Any CPU + {3F84BDCB-E1DF-4447-85FF-7A4B28B42326}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3F84BDCB-E1DF-4447-85FF-7A4B28B42326}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3F84BDCB-E1DF-4447-85FF-7A4B28B42326}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3F84BDCB-E1DF-4447-85FF-7A4B28B42326}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {3F84BDCB-E1DF-4447-85FF-7A4B28B42326}.Debug|x86.ActiveCfg = Debug|Any CPU + {3F84BDCB-E1DF-4447-85FF-7A4B28B42326}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3F84BDCB-E1DF-4447-85FF-7A4B28B42326}.Release|Any CPU.Build.0 = Release|Any CPU + {3F84BDCB-E1DF-4447-85FF-7A4B28B42326}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {3F84BDCB-E1DF-4447-85FF-7A4B28B42326}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {3F84BDCB-E1DF-4447-85FF-7A4B28B42326}.Release|x86.ActiveCfg = Release|Any CPU + {3F84BDCB-E1DF-4447-85FF-7A4B28B42326}.Release-Mono|Any CPU.ActiveCfg = Release|Any CPU + {3F84BDCB-E1DF-4447-85FF-7A4B28B42326}.Release-Mono|Any CPU.Build.0 = Release|Any CPU + {3F84BDCB-E1DF-4447-85FF-7A4B28B42326}.Release-Mono|Mixed Platforms.ActiveCfg = Release|Any CPU + {3F84BDCB-E1DF-4447-85FF-7A4B28B42326}.Release-Mono|Mixed Platforms.Build.0 = Release|Any CPU + {3F84BDCB-E1DF-4447-85FF-7A4B28B42326}.Release-Mono|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -339,6 +356,7 @@ Global {E9160373-8BD2-4D69-B88E-1D3B5BC0A6FB} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} {1B6A87C0-4ACA-4411-8879-844537A52126} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} {9F110A91-DC67-48C1-894D-B36650F38DE1} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} + {3F84BDCB-E1DF-4447-85FF-7A4B28B42326} = {182AEEFE-9B89-4264-BCED-91A00D1EF896} {9AAF3008-8033-4A26-93D2-97928E7801E9} = {2AAC5DFA-3851-4324-A51F-5BC46BEB777C} EndGlobalSection GlobalSection(NDepend) = preSolution diff --git a/Simple.Data/QueryPolyfills/DictionaryEqualityComparer.cs b/Simple.Data/QueryPolyfills/DictionaryEqualityComparer.cs index 206cbb98..d26dc39c 100644 --- a/Simple.Data/QueryPolyfills/DictionaryEqualityComparer.cs +++ b/Simple.Data/QueryPolyfills/DictionaryEqualityComparer.cs @@ -6,6 +6,7 @@ namespace Simple.Data.QueryPolyfills public class DictionaryEqualityComparer : IEqualityComparer> { + public static readonly DictionaryEqualityComparer Instance = new DictionaryEqualityComparer(); public bool Equals(IDictionary x, IDictionary y) { if (ReferenceEquals(x, y)) return true; diff --git a/packages/NUnit.2.6.2/NUnit.2.6.2.nuspec b/packages/NUnit.2.6.3/NUnit.2.6.3.nuspec similarity index 91% rename from packages/NUnit.2.6.2/NUnit.2.6.2.nuspec rename to packages/NUnit.2.6.3/NUnit.2.6.3.nuspec index 57ddc87b..9278b0a5 100644 --- a/packages/NUnit.2.6.2/NUnit.2.6.2.nuspec +++ b/packages/NUnit.2.6.3/NUnit.2.6.3.nuspec @@ -2,7 +2,7 @@ NUnit - 2.6.2 + 2.6.3 NUnit Charlie Poole Charlie Poole @@ -22,6 +22,6 @@ Unlike earlier versions, this package includes only the framework assembly. You The nunit.mocks assembly is now provided by the NUnit.Mocks package. The pnunit.framework assembly is provided by the pNUnit package. en-US - test testing tdd framework fluent assert theory plugin addin + nunit test testing tdd framework fluent assert theory plugin addin \ No newline at end of file diff --git a/packages/NUnit.2.6.2/lib/nunit.framework.xml b/packages/NUnit.2.6.3/lib/nunit.framework.xml similarity index 95% rename from packages/NUnit.2.6.2/lib/nunit.framework.xml rename to packages/NUnit.2.6.3/lib/nunit.framework.xml index 7702ceeb..4c8c26e8 100644 --- a/packages/NUnit.2.6.2/lib/nunit.framework.xml +++ b/packages/NUnit.2.6.3/lib/nunit.framework.xml @@ -4,10896 +4,10957 @@ nunit.framework - + - Attribute used to apply a category to a test + The different targets a test action attribute can be applied to - + - The name of the category + Default target, which is determined by where the action attribute is attached - + - Construct attribute for a given category based on - a name. The name may not contain the characters ',', - '+', '-' or '!'. However, this is not checked in the - constructor since it would cause an error to arise at - as the test was loaded without giving a clear indication - of where the problem is located. The error is handled - in NUnitFramework.cs by marking the test as not - runnable. + Target a individual test case - The name of the category - + - Protected constructor uses the Type name as the name - of the category. + Target a suite of test cases - + - The name of the category + Delegate used by tests that execute code and + capture any thrown exception. - + - Used to mark a field for use as a datapoint when executing a theory - within the same fixture that requires an argument of the field's Type. + The Assert class contains a collection of static methods that + implement the most common assertions used in NUnit. - + - Used to mark an array as containing a set of datapoints to be used - executing a theory within the same fixture that requires an argument - of the Type of the array elements. + We don't actually want any instances of this object, but some people + like to inherit from it to add other static methods. Hence, the + protected constructor disallows any instances of this object. - + - Attribute used to provide descriptive text about a - test case or fixture. + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + - + - Construct the attribute + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. - Text describing the test + + - + - Gets the test description + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + The message to initialize the with. + Arguments to be used in formatting the message - + - Enumeration indicating how the expected message parameter is to be used + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + The message to initialize the with. - - Expect an exact match - - - Expect a message containing the parameter string - - - Match the regular expression provided as a parameter - - - Expect a message that starts with the parameter string - - + - ExpectedExceptionAttribute + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. - - + - Constructor for a non-specific exception + Throws an with the message and arguments + that are passed in. This is used by the other Assert functions. + The message to initialize the with. + Arguments to be used in formatting the message - + - Constructor for a given type of exception + Throws an with the message that is + passed in. This is used by the other Assert functions. - The type of the expected exception + The message to initialize the with. - + - Constructor for a given exception name + Throws an . + This is used by the other Assert functions. - The full name of the expected exception - + - Gets or sets the expected exception type + Throws an with the message and arguments + that are passed in. This causes the test to be reported as ignored. + The message to initialize the with. + Arguments to be used in formatting the message - + - Gets or sets the full Type name of the expected exception + Throws an with the message that is + passed in. This causes the test to be reported as ignored. + The message to initialize the with. - + - Gets or sets the expected message text + Throws an . + This causes the test to be reported as ignored. - + - Gets or sets the user message displayed in case of failure + Throws an with the message and arguments + that are passed in. This causes the test to be reported as inconclusive. + The message to initialize the with. + Arguments to be used in formatting the message - + - Gets or sets the type of match to be performed on the expected message + Throws an with the message that is + passed in. This causes the test to be reported as inconclusive. + The message to initialize the with. - + - Gets the name of a method to be used as an exception handler + Throws an . + This causes the test to be reported as Inconclusive. - + - ExplicitAttribute marks a test or test fixture so that it will - only be run if explicitly executed from the gui or command line - or if it is included by use of a filter. The test will not be - run simply because an enclosing suite is run. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + The actual value to test + A Constraint to be applied - + - Default constructor + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + The actual value to test + A Constraint to be applied + The message that will be displayed on failure - + - Constructor with a reason + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. - The reason test is marked explicit + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message - + - The reason test is marked explicit - + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message - + - Attribute used to mark a test that is to be ignored. - Ignored tests result in a warning message when the - tests are run. + Asserts that a condition is true. If the condition is false the method throws + an . + The evaluated condition + The message to display if the condition is false - + - Constructs the attribute without giving a reason - for ignoring the test. + Asserts that a condition is true. If the condition is false the method throws + an . + The evaluated condition - + - Constructs the attribute giving a reason for ignoring the test + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. - The reason for ignoring the test + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied - + - The reason for ignoring a test + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure - + - Abstract base for Attributes that are used to include tests - in the test run based on environmental settings. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Constructor with no included items specified, for use - with named property syntax. + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + The actual value to test + A Constraint to be applied - + - Constructor taking one or more included items + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. - Comma-delimited list of included items + The actual value to test + A Constraint to be applied + The message that will be displayed on failure - + - Name of the item that is needed in order for - a test to run. Multiple itemss may be given, - separated by a comma. + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + The actual value to test + A Constraint to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Name of the item to be excluded. Multiple items - may be given, separated by a comma. + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + A TestDelegate to be executed + A ThrowsConstraint used in the test - + - The reason for including or excluding the test + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + Used as a synonym for That in rare cases where a private setter + causes a Visual Basic compilation error. + The actual value to test + A Constraint to be applied - + - PlatformAttribute is used to mark a test fixture or an - individual method as applying to a particular platform only. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + Used as a synonym for That in rare cases where a private setter + causes a Visual Basic compilation error. + The actual value to test + A Constraint to be applied + The message that will be displayed on failure - + - Constructor with no platforms specified, for use - with named property syntax. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + Used as a synonym for That in rare cases where a private setter + causes a Visual Basic compilation error. + + This method is provided for use by VB developers needing to test + the value of properties with private setters. + + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Constructor taking one or more platforms + Verifies that a delegate throws a particular exception when called. - Comma-deliminted list of platforms + A constraint to be satisfied by the exception + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message - + - CultureAttribute is used to mark a test fixture or an - individual method as applying to a particular Culture only. + Verifies that a delegate throws a particular exception when called. + A constraint to be satisfied by the exception + A TestDelegate + The message that will be displayed on failure - + - Constructor with no cultures specified, for use - with named property syntax. + Verifies that a delegate throws a particular exception when called. + A constraint to be satisfied by the exception + A TestDelegate - + - Constructor taking one or more cultures + Verifies that a delegate throws a particular exception when called. - Comma-deliminted list of cultures + The exception Type expected + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Marks a test to use a combinatorial join of any argument data - provided. NUnit will create a test case for every combination of - the arguments provided. This can result in a large number of test - cases and so should be used judiciously. This is the default join - type, so the attribute need not be used except as documentation. + Verifies that a delegate throws a particular exception when called. + The exception Type expected + A TestDelegate + The message that will be displayed on failure - + - PropertyAttribute is used to attach information to a test as a name/value pair.. + Verifies that a delegate throws a particular exception when called. + The exception Type expected + A TestDelegate - + - Construct a PropertyAttribute with a name and string value + Verifies that a delegate throws a particular exception when called. - The name of the property - The property value + Type of the expected exception + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Construct a PropertyAttribute with a name and int value + Verifies that a delegate throws a particular exception when called. - The name of the property - The property value + Type of the expected exception + A TestDelegate + The message that will be displayed on failure - + - Construct a PropertyAttribute with a name and double value + Verifies that a delegate throws a particular exception when called. - The name of the property - The property value + Type of the expected exception + A TestDelegate - + - Constructor for derived classes that set the - property dictionary directly. + Verifies that a delegate throws an exception when called + and returns it. + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Constructor for use by derived classes that use the - name of the type as the property name. Derived classes - must ensure that the Type of the property value is - a standard type supported by the BCL. Any custom - types will cause a serialization Exception when - in the client. + Verifies that a delegate throws an exception when called + and returns it. + A TestDelegate + The message that will be displayed on failure - + - Gets the property dictionary for this attribute + Verifies that a delegate throws an exception when called + and returns it. + A TestDelegate - + - Default constructor + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Marks a test to use pairwise join of any argument data provided. - NUnit will attempt too excercise every pair of argument values at - least once, using as small a number of test cases as it can. With - only two arguments, this is the same as a combinatorial join. + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + The expected Exception Type + A TestDelegate + The message that will be displayed on failure - + - Default constructor + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + The expected Exception Type + A TestDelegate - + - Marks a test to use a sequential join of any argument data - provided. NUnit will use arguements for each parameter in - sequence, generating test cases up to the largest number - of argument values provided and using null for any arguments - for which it runs out of values. Normally, this should be - used with the same number of arguments for each parameter. + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Default constructor + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + The expected Exception Type + A TestDelegate + The message that will be displayed on failure - + - Summary description for MaxTimeAttribute. + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + The expected Exception Type + A TestDelegate - + - Construct a MaxTimeAttribute, given a time in milliseconds. + Verifies that a delegate does not throw an exception - The maximum elapsed time in milliseconds + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message - + - RandomAttribute is used to supply a set of random values - to a single parameter of a parameterized test. + Verifies that a delegate does not throw an exception. + A TestDelegate + The message that will be displayed on failure - + - ValuesAttribute is used to provide literal arguments for - an individual parameter of a test. + Verifies that a delegate does not throw an exception. + A TestDelegate - + - Abstract base class for attributes that apply to parameters - and supply data for the parameter. + Asserts that a condition is true. If the condition is false the method throws + an . + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message - + - Gets the data to be provided to the specified parameter + Asserts that a condition is true. If the condition is false the method throws + an . + The evaluated condition + The message to display in case of failure - + - The collection of data to be returned. Must - be set by any derived attribute classes. - We use an object[] so that the individual - elements may have their type changed in GetData - if necessary. + Asserts that a condition is true. If the condition is false the method throws + an . + The evaluated condition - + - Construct with one argument + Asserts that a condition is true. If the condition is false the method throws + an . - + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message - + - Construct with two arguments + Asserts that a condition is true. If the condition is false the method throws + an . - - + The evaluated condition + The message to display in case of failure - + - Construct with three arguments + Asserts that a condition is true. If the condition is false the method throws + an . - - - + The evaluated condition - + - Construct with an array of arguments - - + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message - + - Get the collection of values to be used as arguments - + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure - + - Construct a set of doubles from 0.0 to 1.0, - specifying only the count. - - + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition - + - Construct a set of doubles from min to max - - - - + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message - + - Construct a set of ints from min to max - - - - + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure - + - Get the collection of values to be used as arguments - + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition - + - RangeAttribute is used to supply a range of values to an - individual parameter of a parameterized test. + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message - + - Construct a range of ints using default step of 1 + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. - - + The object that is to be tested + The message to display in case of failure - + - Construct a range of ints specifying the step size + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. - - - + The object that is to be tested - + - Construct a range of longs + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. - - - + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message - + - Construct a range of doubles + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. - - - + The object that is to be tested + The message to display in case of failure - + - Construct a range of floats + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. - - - + The object that is to be tested - + - RepeatAttribute may be applied to test case in order - to run it multiple times. + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message - + - Construct a RepeatAttribute + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. - The number of times to run the test + The object that is to be tested + The message to display in case of failure - + - RequiredAddinAttribute may be used to indicate the names of any addins - that must be present in order to run some or all of the tests in an - assembly. If the addin is not loaded, the entire assembly is marked - as NotRunnable. + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + The object that is to be tested - + - Initializes a new instance of the class. + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. - The required addin. + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message - + - Gets the name of required addin. + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. - The required addin name. + The object that is to be tested + The message to display in case of failure - + - Summary description for SetCultureAttribute. + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + The object that is to be tested - + - Construct given the name of a culture + Verifies that two ints are equal. If they are not, then an + is thrown. - + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message - + - Summary description for SetUICultureAttribute. + Verifies that two ints are equal. If they are not, then an + is thrown. + The expected value + The actual value + The message to display in case of failure - + - Construct given the name of a culture + Verifies that two ints are equal. If they are not, then an + is thrown. - + The expected value + The actual value - + - SetUpAttribute is used in a TestFixture to identify a method - that is called immediately before each test is run. It is - also used in a SetUpFixture to identify the method that is - called once, before any of the subordinate tests are run. + Verifies that two longs are equal. If they are not, then an + is thrown. + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message - + - Attribute used to mark a class that contains one-time SetUp - and/or TearDown methods that apply to all the tests in a - namespace or an assembly. + Verifies that two longs are equal. If they are not, then an + is thrown. + The expected value + The actual value + The message to display in case of failure - + - Attribute used to mark a static (shared in VB) property - that returns a list of tests. + Verifies that two longs are equal. If they are not, then an + is thrown. + The expected value + The actual value - + - Attribute used in a TestFixture to identify a method that is - called immediately after each test is run. It is also used - in a SetUpFixture to identify the method that is called once, - after all subordinate tests have run. In either case, the method - is guaranteed to be called, even if an exception is thrown. + Verifies that two unsigned ints are equal. If they are not, then an + is thrown. + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message - + - Provide actions to execute before and after tests. + Verifies that two unsigned ints are equal. If they are not, then an + is thrown. + The expected value + The actual value + The message to display in case of failure - + - When implemented by an attribute, this interface implemented to provide actions to execute before and after tests. + Verifies that two unsigned ints are equal. If they are not, then an + is thrown. + The expected value + The actual value - + - Executed before each test is run + Verifies that two unsigned longs are equal. If they are not, then an + is thrown. - Provides details about the test that is going to be run. + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message - + - Executed after each test is run + Verifies that two unsigned longs are equal. If they are not, then an + is thrown. - Provides details about the test that has just been run. + The expected value + The actual value + The message to display in case of failure - + - Provides the target for the action attribute + Verifies that two unsigned longs are equal. If they are not, then an + is thrown. - The target for the action attribute + The expected value + The actual value - + - Adding this attribute to a method within a - class makes the method callable from the NUnit test runner. There is a property - called Description which is optional which you can provide a more detailed test - description. This class cannot be inherited. + Verifies that two decimals are equal. If they are not, then an + is thrown. - - - [TestFixture] - public class Fixture - { - [Test] - public void MethodToTest() - {} - - [Test(Description = "more detailed description")] - publc void TestDescriptionMethod() - {} - } - - + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message - + - Descriptive text for this test + Verifies that two decimals are equal. If they are not, then an + is thrown. + The expected value + The actual value + The message to display in case of failure - + - TestCaseAttribute is used to mark parameterized test cases - and provide them with their arguments. + Verifies that two decimals are equal. If they are not, then an + is thrown. + The expected value + The actual value - + - The ITestCaseData interface is implemented by a class - that is able to return complete testcases for use by - a parameterized test method. - - NOTE: This interface is used in both the framework - and the core, even though that results in two different - types. However, sharing the source code guarantees that - the various implementations will be compatible and that - the core is able to reflect successfully over the - framework implementations of ITestCaseData. + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message - + - Gets the argument list to be provided to the test + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure - + - Gets the expected result + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual - + - Indicates whether a result has been specified. - This is necessary because the result may be - null, so it's value cannot be checked. + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message - + - Gets the expected exception Type + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure - + - Gets the FullName of the expected exception + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual - + - Gets the name to be used for the test + Verifies that two objects are equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are not equal an is thrown. + The value that is expected + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message - + - Gets the description of the test + Verifies that two objects are equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are not equal an is thrown. + The value that is expected + The actual value + The message to display in case of failure - + - Gets a value indicating whether this is ignored. + Verifies that two objects are equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are not equal an is thrown. - true if ignored; otherwise, false. + The value that is expected + The actual value - + - Gets a value indicating whether this is explicit. + Verifies that two ints are not equal. If they are equal, then an + is thrown. - true if explicit; otherwise, false. + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message - + - Gets the ignore reason. + Verifies that two ints are not equal. If they are equal, then an + is thrown. - The ignore reason. + The expected value + The actual value + The message to display in case of failure - + - Construct a TestCaseAttribute with a list of arguments. - This constructor is not CLS-Compliant + Verifies that two ints are not equal. If they are equal, then an + is thrown. - + The expected value + The actual value - + - Construct a TestCaseAttribute with a single argument + Verifies that two longs are not equal. If they are equal, then an + is thrown. - + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message - + - Construct a TestCaseAttribute with a two arguments + Verifies that two longs are not equal. If they are equal, then an + is thrown. - - + The expected value + The actual value + The message to display in case of failure - + - Construct a TestCaseAttribute with a three arguments + Verifies that two longs are not equal. If they are equal, then an + is thrown. - - - + The expected value + The actual value - + - Gets the list of arguments to a test case + Verifies that two unsigned ints are not equal. If they are equal, then an + is thrown. + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message - + - Gets or sets the expected result. Use - ExpectedResult by preference. + Verifies that two unsigned ints are not equal. If they are equal, then an + is thrown. - The result. + The expected value + The actual value + The message to display in case of failure - + - Gets or sets the expected result. + Verifies that two unsigned ints are not equal. If they are equal, then an + is thrown. - The result. + The expected value + The actual value - + - Gets a flag indicating whether an expected - result has been set. + Verifies that two unsigned longs are not equal. If they are equal, then an + is thrown. + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message - + - Gets a list of categories associated with this test; + Verifies that two unsigned longs are not equal. If they are equal, then an + is thrown. + The expected value + The actual value + The message to display in case of failure - + - Gets or sets the category associated with this test. - May be a single category or a comma-separated list. + Verifies that two unsigned longs are not equal. If they are equal, then an + is thrown. + The expected value + The actual value - + - Gets or sets the expected exception. + Verifies that two decimals are not equal. If they are equal, then an + is thrown. - The expected exception. + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message - + - Gets or sets the name the expected exception. + Verifies that two decimals are not equal. If they are equal, then an + is thrown. - The expected name of the exception. + The expected value + The actual value + The message to display in case of failure - + - Gets or sets the expected message of the expected exception + Verifies that two decimals are not equal. If they are equal, then an + is thrown. - The expected message of the exception. + The expected value + The actual value - + - Gets or sets the type of match to be performed on the expected message + Verifies that two floats are not equal. If they are equal, then an + is thrown. + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message - + - Gets or sets the description. + Verifies that two floats are not equal. If they are equal, then an + is thrown. - The description. + The expected value + The actual value + The message to display in case of failure - + - Gets or sets the name of the test. + Verifies that two floats are not equal. If they are equal, then an + is thrown. - The name of the test. + The expected value + The actual value - + - Gets or sets the ignored status of the test + Verifies that two doubles are not equal. If they are equal, then an + is thrown. + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message - + - Gets or sets the ignored status of the test + Verifies that two doubles are not equal. If they are equal, then an + is thrown. + The expected value + The actual value + The message to display in case of failure - + - Gets or sets the explicit status of the test + Verifies that two doubles are not equal. If they are equal, then an + is thrown. + The expected value + The actual value - + - Gets or sets the reason for not running the test + Verifies that two objects are not equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are equal an is thrown. + The value that is expected + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message - + - Gets or sets the reason for not running the test. - Set has the side effect of marking the test as ignored. + Verifies that two objects are not equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are equal an is thrown. - The ignore reason. + The value that is expected + The actual value + The message to display in case of failure - + - FactoryAttribute indicates the source to be used to - provide test cases for a test method. + Verifies that two objects are not equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are equal an is thrown. + The value that is expected + The actual value - + - Construct with the name of the data source, which must - be a property, field or method of the test class itself. + Asserts that two objects refer to the same object. If they + are not the same an is thrown. - An array of the names of the factories that will provide data + The expected object + The actual object + The message to display in case of failure + Array of objects to be used in formatting the message - + - Construct with a Type, which must implement IEnumerable + Asserts that two objects refer to the same object. If they + are not the same an is thrown. - The Type that will provide data + The expected object + The actual object + The message to display in case of failure - + - Construct with a Type and name. - that don't support params arrays. + Asserts that two objects refer to the same object. If they + are not the same an is thrown. - The Type that will provide data - The name of the method, property or field that will provide data + The expected object + The actual object - + - The name of a the method, property or fiend to be used as a source + Asserts that two objects do not refer to the same object. If they + are the same an is thrown. + The expected object + The actual object + The message to display in case of failure + Array of objects to be used in formatting the message - + - A Type to be used as a source + Asserts that two objects do not refer to the same object. If they + are the same an is thrown. + The expected object + The actual object + The message to display in case of failure - + - Gets or sets the category associated with this test. - May be a single category or a comma-separated list. + Asserts that two objects do not refer to the same object. If they + are the same an is thrown. + The expected object + The actual object - - - [TestFixture] - public class ExampleClass - {} - - - + - Default constructor + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + The value that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message - + - Construct with a object[] representing a set of arguments. - In .NET 2.0, the arguments may later be separated into - type arguments and constructor arguments. + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. - + The value that is to be tested + The message to display in case of failure - + - Descriptive text for this fixture + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + The value that is to be tested - + - Gets and sets the category for this fixture. - May be a comma-separated list of categories. + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + The value that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message - + - Gets a list of categories for this fixture + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + The value that is to be tested + The message to display in case of failure - + - The arguments originally provided to the attribute - - - - - Gets or sets a value indicating whether this should be ignored. + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. - true if ignore; otherwise, false. + The value that is to be tested - + - Gets or sets the ignore reason. May set Ignored as a side effect. + Assert that a string is empty - that is equal to string.Empty - The ignore reason. + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message - + - Get or set the type arguments. If not set - explicitly, any leading arguments that are - Types are taken as type arguments. + Assert that a string is empty - that is equal to string.Empty + The string to be tested + The message to display in case of failure - + - Attribute used to identify a method that is - called before any tests in a fixture are run. + Assert that a string is empty - that is equal to string.Empty + The string to be tested - + - Attribute used to identify a method that is called after - all the tests in a fixture have run. The method is - guaranteed to be called, even if an exception is thrown. + Assert that an array, list or other collection is empty + An array, list or other collection implementing ICollection + The message to display in case of failure + Array of objects to be used in formatting the message - + - Adding this attribute to a method within a - class makes the method callable from the NUnit test runner. There is a property - called Description which is optional which you can provide a more detailed test - description. This class cannot be inherited. + Assert that an array, list or other collection is empty - - - [TestFixture] - public class Fixture - { - [Test] - public void MethodToTest() - {} - - [Test(Description = "more detailed description")] - publc void TestDescriptionMethod() - {} - } - - + An array, list or other collection implementing ICollection + The message to display in case of failure - + - Used on a method, marks the test with a timeout value in milliseconds. - The test will be run in a separate thread and is cancelled if the timeout - is exceeded. Used on a method or assembly, sets the default timeout - for all contained test methods. + Assert that an array, list or other collection is empty + An array, list or other collection implementing ICollection - + - Construct a TimeoutAttribute given a time in milliseconds + Assert that a string is not empty - that is not equal to string.Empty - The timeout value in milliseconds + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message - + - Marks a test that must run in the STA, causing it - to run in a separate thread if necessary. - - On methods, you may also use STAThreadAttribute - to serve the same purpose. + Assert that a string is not empty - that is not equal to string.Empty + The string to be tested + The message to display in case of failure - + - Construct a RequiresSTAAttribute + Assert that a string is not empty - that is not equal to string.Empty + The string to be tested - + - Marks a test that must run in the MTA, causing it - to run in a separate thread if necessary. - - On methods, you may also use MTAThreadAttribute - to serve the same purpose. + Assert that an array, list or other collection is not empty + An array, list or other collection implementing ICollection + The message to display in case of failure + Array of objects to be used in formatting the message - + - Construct a RequiresMTAAttribute + Assert that an array, list or other collection is not empty + An array, list or other collection implementing ICollection + The message to display in case of failure - + - Marks a test that must run on a separate thread. + Assert that an array, list or other collection is not empty + An array, list or other collection implementing ICollection - + - Construct a RequiresThreadAttribute + Assert that a string is either null or equal to string.Empty + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message - + - Construct a RequiresThreadAttribute, specifying the apartment + Assert that a string is either null or equal to string.Empty + The string to be tested + The message to display in case of failure - + - ValueSourceAttribute indicates the source to be used to - provide data for one parameter of a test method. + Assert that a string is either null or equal to string.Empty + The string to be tested - + - Construct with the name of the factory - for use with languages - that don't support params arrays. + Assert that a string is not null or empty - The name of the data source to be used + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message - + - Construct with a Type and name - for use with languages - that don't support params arrays. + Assert that a string is not null or empty - The Type that will provide data - The name of the method, property or field that will provide data + The string to be tested + The message to display in case of failure - + - The name of a the method, property or fiend to be used as a source + Assert that a string is not null or empty + The string to be tested - + - A Type to be used as a source + Asserts that an object may be assigned a value of a given Type. + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message - + - AttributeExistsConstraint tests for the presence of a - specified attribute on a Type. + Asserts that an object may be assigned a value of a given Type. + The expected Type. + The object under examination + The message to display in case of failure - + - The Constraint class is the base of all built-in constraints - within NUnit. It provides the operator overloads used to combine - constraints. + Asserts that an object may be assigned a value of a given Type. + The expected Type. + The object under examination - + - The IConstraintExpression interface is implemented by all - complete and resolvable constraints and expressions. + Asserts that an object may be assigned a value of a given Type. + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message - + - Return the top-level constraint for this expression + Asserts that an object may be assigned a value of a given Type. - + The expected Type. + The object under examination + The message to display in case of failure - + - Static UnsetObject used to detect derived constraints - failing to set the actual value. + Asserts that an object may be assigned a value of a given Type. + The expected Type. + The object under examination - + - The actual value being tested against a constraint + Asserts that an object may not be assigned a value of a given Type. + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message - + - The display name of this Constraint for use by ToString() + Asserts that an object may not be assigned a value of a given Type. + The expected Type. + The object under examination + The message to display in case of failure - + - Argument fields used by ToString(); + Asserts that an object may not be assigned a value of a given Type. + The expected Type. + The object under examination - + - The builder holding this constraint + Asserts that an object may not be assigned a value of a given Type. + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message - + - Construct a constraint with no arguments + Asserts that an object may not be assigned a value of a given Type. + The expected Type. + The object under examination + The message to display in case of failure - + - Construct a constraint with one argument + Asserts that an object may not be assigned a value of a given Type. + The expected Type. + The object under examination - + - Construct a constraint with two arguments + Asserts that an object is an instance of a given type. + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message - + - Sets the ConstraintBuilder holding this constraint + Asserts that an object is an instance of a given type. + The expected Type + The object being examined + The message to display in case of failure - + - Write the failure message to the MessageWriter provided - as an argument. The default implementation simply passes - the constraint and the actual value to the writer, which - then displays the constraint description and the value. - - Constraints that need to provide additional details, - such as where the error occured can override this. + Asserts that an object is an instance of a given type. - The MessageWriter on which to display the message + The expected Type + The object being examined - + - Test whether the constraint is satisfied by a given value + Asserts that an object is an instance of a given type. - The value to be tested - True for success, false for failure + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message - + - Test whether the constraint is satisfied by an - ActualValueDelegate that returns the value to be tested. - The default implementation simply evaluates the delegate - but derived classes may override it to provide for delayed - processing. + Asserts that an object is an instance of a given type. - An ActualValueDelegate - True for success, false for failure + The expected Type + The object being examined + The message to display in case of failure - + - Test whether the constraint is satisfied by a given reference. - The default implementation simply dereferences the value but - derived classes may override it to provide for delayed processing. + Asserts that an object is an instance of a given type. - A reference to the value to be tested - True for success, false for failure + The expected Type + The object being examined - + - Write the constraint description to a MessageWriter + Asserts that an object is an instance of a given type. - The writer on which the description is displayed + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message - + - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. + Asserts that an object is an instance of a given type. - The writer on which the actual value is displayed + The expected Type + The object being examined + The message to display in case of failure - + - Default override of ToString returns the constraint DisplayName - followed by any arguments within angle brackets. + Asserts that an object is an instance of a given type. - + The expected Type + The object being examined - + - Returns the string representation of this constraint + Asserts that an object is not an instance of a given type. + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message - + - This operator creates a constraint that is satisfied only if both - argument constraints are satisfied. + Asserts that an object is not an instance of a given type. + The expected Type + The object being examined + The message to display in case of failure - + - This operator creates a constraint that is satisfied if either - of the argument constraints is satisfied. + Asserts that an object is not an instance of a given type. + The expected Type + The object being examined - + - This operator creates a constraint that is satisfied if the - argument constraint is not satisfied. + Asserts that an object is not an instance of a given type. + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message - + - Returns a DelayedConstraint with the specified delay time. + Asserts that an object is not an instance of a given type. - The delay in milliseconds. - + The expected Type + The object being examined + The message to display in case of failure - + - Returns a DelayedConstraint with the specified delay time - and polling interval. + Asserts that an object is not an instance of a given type. - The delay in milliseconds. - The interval at which to test the constraint. - + The expected Type + The object being examined - + - The display name of this Constraint for use by ToString(). - The default value is the name of the constraint with - trailing "Constraint" removed. Derived classes may set - this to another name in their constructors. + Asserts that an object is not an instance of a given type. + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message - + - Returns a ConstraintExpression by appending And - to the current constraint. + Asserts that an object is not an instance of a given type. + The expected Type + The object being examined + The message to display in case of failure - + - Returns a ConstraintExpression by appending And - to the current constraint. + Asserts that an object is not an instance of a given type. + The expected Type + The object being examined - + - Returns a ConstraintExpression by appending Or - to the current constraint. + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message - + - Class used to detect any derived constraints - that fail to set the actual value in their - Matches override. + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure - + - Constructs an AttributeExistsConstraint for a specific attribute Type + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. - + The first value, expected to be greater + The second value, expected to be less - + - Tests whether the object provides the expected attribute. + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. - A Type, MethodInfo, or other ICustomAttributeProvider - True if the expected attribute is present, otherwise false + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message - + - Writes the description of the constraint to the specified writer + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure - + - AttributeConstraint tests that a specified attribute is present - on a Type or other provider and that the value of the attribute - satisfies some other constraint. + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less - + - Abstract base class used for prefixes + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message - + - The base constraint + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure - + - Construct given a base constraint + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. - + The first value, expected to be greater + The second value, expected to be less - + - Constructs an AttributeConstraint for a specified attriute - Type and base constraint. + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. - - - - + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + - Determines whether the Type or other provider has the - expected attribute and if its value matches the - additional constraint specified. + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure - + - Writes a description of the attribute to the specified writer. + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less - + - Writes the actual value supplied to the specified writer. + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message - + - Returns a string representation of the constraint. + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure - + - BasicConstraint is the abstract base for constraints that - perform a simple comparison to a constant value. + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less - + - Initializes a new instance of the class. + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. - The expected. - The description. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message - + - Test whether the constraint is satisfied by a given value + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. - The value to be tested - True for success, false for failure + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure - + - Write the constraint description to a MessageWriter + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. - The writer on which the description is displayed + The first value, expected to be greater + The second value, expected to be less - + - NullConstraint tests that the actual value is null + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message - + - Initializes a new instance of the class. + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure - + - TrueConstraint tests that the actual value is true + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less - + - Initializes a new instance of the class. + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message - + - FalseConstraint tests that the actual value is false + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure - + - Initializes a new instance of the class. + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less - + - NaNConstraint tests that the actual value is a double or float NaN + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message - + - Test that the actual value is an NaN + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. - - + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure - + - Write the constraint description to a specified writer + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. - + The first value, expected to be less + The second value, expected to be greater - + - BinaryConstraint is the abstract base of all constraints - that combine two other constraints in some fashion. + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message - + - The first constraint being combined + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure - + - The second constraint being combined + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater - + - Construct a BinaryConstraint from two other constraints + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. - The first constraint - The second constraint + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message - + - AndConstraint succeeds only if both members succeed. + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure - + - Create an AndConstraint from two other constraints + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. - The first constraint - The second constraint + The first value, expected to be less + The second value, expected to be greater - + - Apply both member constraints to an actual value, succeeding - succeeding only if both of them succeed. + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. - The actual value - True if the constraints both succeeded + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message - + - Write a description for this contraint to a MessageWriter + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. - The MessageWriter to receive the description + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure - + - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. - The writer on which the actual value is displayed + The first value, expected to be less + The second value, expected to be greater - + - OrConstraint succeeds if either member succeeds + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message - + - Create an OrConstraint from two other constraints + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. - The first constraint - The second constraint + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure - + - Apply the member constraints to an actual value, succeeding - succeeding as soon as one of them succeeds. + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. - The actual value - True if either constraint succeeded + The first value, expected to be less + The second value, expected to be greater - + - Write a description for this contraint to a MessageWriter + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. - The MessageWriter to receive the description + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message - + - CollectionConstraint is the abstract base class for - constraints that operate on collections. + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure - + - Construct an empty CollectionConstraint + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater - + - Construct a CollectionConstraint + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. - + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message - + - Determines whether the specified enumerable is empty. + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. - The enumerable. - - true if the specified enumerable is empty; otherwise, false. - + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure - + - Test whether the constraint is satisfied by a given value + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. - The value to be tested - True for success, false for failure + The first value, expected to be less + The second value, expected to be greater - + - Protected method to be implemented by derived classes + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. - - + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message - + - CollectionItemsEqualConstraint is the abstract base class for all - collection constraints that apply some notion of item equality - as a part of their operation. + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure - + - Construct an empty CollectionConstraint + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater - + - Construct a CollectionConstraint + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. - + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message - + - Flag the constraint to use the supplied IComparer object. + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. - The IComparer object to use. - Self. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure - + - Flag the constraint to use the supplied IComparer object. + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. - The IComparer object to use. - Self. + The first value, expected to be greater + The second value, expected to be less - + - Flag the constraint to use the supplied Comparison object. + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. - The IComparer object to use. - Self. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message - + - Flag the constraint to use the supplied IEqualityComparer object. + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. - The IComparer object to use. - Self. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure - + - Flag the constraint to use the supplied IEqualityComparer object. + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. - The IComparer object to use. - Self. + The first value, expected to be greater + The second value, expected to be less - + - Compares two collection members for equality + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message - + - Return a new CollectionTally for use in making tests + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. - The collection to be included in the tally + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure - + - Flag the constraint to ignore case and return self. + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less - + - EmptyCollectionConstraint tests whether a collection is empty. + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message - + - Check that the collection is empty + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. - - + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure - + - Write the constraint description to a MessageWriter + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. - + The first value, expected to be greater + The second value, expected to be less - + - UniqueItemsConstraint tests whether all the items in a - collection are unique. + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message - + - Check that all items are unique. + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. - - + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure - + - Write a description of this constraint to a MessageWriter + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. - + The first value, expected to be greater + The second value, expected to be less - + - CollectionContainsConstraint is used to test whether a collection - contains an expected object as a member. + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message - + - Construct a CollectionContainsConstraint + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. - + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure - + - Test whether the expected item is contained in the collection + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. - - + The first value, expected to be greater + The second value, expected to be less - + - Write a descripton of the constraint to a MessageWriter + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. - + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message - + - CollectionEquivalentCOnstraint is used to determine whether two - collections are equivalent. + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure - + - Construct a CollectionEquivalentConstraint + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. - + The first value, expected to be greater + The second value, expected to be less - + - Test whether two collections are equivalent + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. - - + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message - + - Write a description of this constraint to a MessageWriter + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. - + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure - + - CollectionSubsetConstraint is used to determine whether - one collection is a subset of another + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + The first value, expected to be greater + The second value, expected to be less - + - Construct a CollectionSubsetConstraint + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. - The collection that the actual value is expected to be a subset of + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message - + - Test whether the actual collection is a subset of - the expected collection provided. + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. - - + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure - + - Write a description of this constraint to a MessageWriter + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. - + The first value, expected to be less + The second value, expected to be greater - + - CollectionOrderedConstraint is used to test whether a collection is ordered. + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message - + - Construct a CollectionOrderedConstraint + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure - + - Modifies the constraint to use an IComparer and returns self. + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater - + - Modifies the constraint to use an IComparer<T> and returns self. + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message - + - Modifies the constraint to use a Comparison<T> and returns self. + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure - + - Modifies the constraint to test ordering by the value of - a specified property and returns self. + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater - + - Test whether the collection is ordered + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. - - + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message - + - Write a description of the constraint to a MessageWriter + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. - + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure - + - Returns the string representation of the constraint. + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. - + The first value, expected to be less + The second value, expected to be greater - + - If used performs a reverse comparison + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message - + - CollectionTally counts (tallies) the number of - occurences of each object in one or more enumerations. - - - - - Construct a CollectionTally object from a comparer and a collection + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure - + - Try to remove an object from the tally + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. - The object to remove - True if successful, false if the object was not found + The first value, expected to be less + The second value, expected to be greater - + - Try to remove a set of objects from the tally + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. - The objects to remove - True if successful, false if any object was not found + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message - + - The number of objects remaining in the tally + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure - + - ComparisonAdapter class centralizes all comparisons of - values in NUnit, adapting to the use of any provided - IComparer, IComparer<T> or Comparison<T> + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater - + - Returns a ComparisonAdapter that wraps an IComparer + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message - + - Returns a ComparisonAdapter that wraps an IComparer<T> + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure - + - Returns a ComparisonAdapter that wraps a Comparison<T> + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater - + - Compares two objects + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message - + - Gets the default ComparisonAdapter, which wraps an - NUnitComparer object. + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure - + - Construct a ComparisonAdapter for an IComparer + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + The first value, expected to be less + The second value, expected to be greater - + - Compares two objects + Asserts that an object is contained in a list. - - - + The expected object + The list to be examined + The message to display in case of failure + Array of objects to be used in formatting the message - + - Construct a default ComparisonAdapter + Asserts that an object is contained in a list. + The expected object + The list to be examined + The message to display in case of failure - + - ComparisonAdapter<T> extends ComparisonAdapter and - allows use of an IComparer<T> or Comparison<T> - to actually perform the comparison. + Asserts that an object is contained in a list. + The expected object + The list to be examined - + - Construct a ComparisonAdapter for an IComparer<T> + Helper for Assert.AreEqual(double expected, double actual, ...) + allowing code generation to work consistently. + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message - + - Compare a Type T to an object + Gets the number of assertions executed so far and + resets the counter to zero. - + - Construct a ComparisonAdapter for a Comparison<T> + AssertionHelper is an optional base class for user tests, + allowing the use of shorter names for constraints and + asserts and avoiding conflict with the definition of + , from which it inherits much of its + behavior, in certain mock object frameworks. - + - Compare a Type T to an object + Helper class with properties and methods that supply + a number of constraints used in Asserts. - + - Abstract base class for constraints that compare values to - determine if one is greater than, equal to or less than - the other. This class supplies the Using modifiers. + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. - + - ComparisonAdapter to be used in making the comparison + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. - + - Initializes a new instance of the class. + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. - + - Initializes a new instance of the class. + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. - + - Modifies the constraint to use an IComparer and returns self + Returns a constraint that tests two items for equality - + - Modifies the constraint to use an IComparer<T> and returns self + Returns a constraint that tests that two references are the same object - + - Modifies the constraint to use a Comparison<T> and returns self + Returns a constraint that tests whether the + actual value is greater than the suppled argument - + - Delegate used to delay evaluation of the actual value - to be used in evaluating a constraint + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument - + - ConstraintBuilder maintains the stacks that are used in - processing a ConstraintExpression. An OperatorStack - is used to hold operators that are waiting for their - operands to be reognized. a ConstraintStack holds - input constraints as well as the results of each - operator applied. + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument - + - Initializes a new instance of the class. + Returns a constraint that tests whether the + actual value is less than the suppled argument - + - Appends the specified operator to the expression by first - reducing the operator stack and then pushing the new - operator on the stack. + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument - The operator to push. - + - Appends the specified constraint to the expresson by pushing - it on the constraint stack. + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument - The constraint to push. - + - Sets the top operator right context. + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. - The right context. - + - Reduces the operator stack until the topmost item - precedence is greater than or equal to the target precedence. + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. - The target precedence. - + - Resolves this instance, returning a Constraint. If the builder - is not currently in a resolvable state, an exception is thrown. + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. - The resolved constraint - + - Gets a value indicating whether this instance is resolvable. - - - true if this instance is resolvable; otherwise, false. - + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + - + - OperatorStack is a type-safe stack for holding ConstraintOperators + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. - + - Initializes a new instance of the class. + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. - The builder. - + - Pushes the specified operator onto the stack. + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. - The op. - + - Pops the topmost operator from the stack. + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. - - + - Gets a value indicating whether this is empty. + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. - true if empty; otherwise, false. - + - Gets the topmost operator without modifying the stack. + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. - The top. - + - ConstraintStack is a type-safe stack for holding Constraints + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. - + - Initializes a new instance of the class. + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. - The builder. - + - Pushes the specified constraint. As a side effect, - the constraint's builder field is set to the - ConstraintBuilder owning this stack. + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. - The constraint. - + - Pops this topmost constrait from the stack. - As a side effect, the constraint's builder - field is set to null. + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. - - + - Gets a value indicating whether this is empty. + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. - true if empty; otherwise, false. - + - Gets the topmost constraint without modifying the stack. + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. - The topmost constraint - + - ConstraintExpression represents a compound constraint in the - process of being constructed from a series of syntactic elements. - - Individual elements are appended to the expression as they are - reognized. Once an actual Constraint is appended, the expression - returns a resolvable Constraint. + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. - + - ConstraintExpressionBase is the abstract base class for the - ConstraintExpression class, which represents a - compound constraint in the process of being constructed - from a series of syntactic elements. - - NOTE: ConstraintExpressionBase is separate because the - ConstraintExpression class was generated in earlier - versions of NUnit. The two classes may be combined - in a future version. + Returns a constraint that fails if the actual + value contains the substring supplied as an argument. - + - The ConstraintBuilder holding the elements recognized so far + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. - + - Initializes a new instance of the class. + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. - + - Initializes a new instance of the - class passing in a ConstraintBuilder, which may be pre-populated. + Returns a constraint that fails if the actual + value starts with the substring supplied as an argument. - The builder. - + - Returns a string representation of the expression as it - currently stands. This should only be used for testing, - since it has the side-effect of resolving the expression. + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. - - + - Appends an operator to the expression and returns the - resulting expression itself. + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. - + - Appends a self-resolving operator to the expression and - returns a new ResolvableConstraintExpression. + Returns a constraint that fails if the actual + value ends with the substring supplied as an argument. - + - Appends a constraint to the expression and returns that - constraint, which is associated with the current state - of the expression being built. + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. - + - Initializes a new instance of the class. + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. - + - Initializes a new instance of the - class passing in a ConstraintBuilder, which may be pre-populated. + Returns a constraint that fails if the actual + value matches the pattern supplied as an argument. - The builder. - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding only if a specified number of them succeed. + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. - + - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. - + - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. - + - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. + Returns a constraint that tests whether the actual value falls + within a specified range. - + - Returns the constraint provided as an argument - used to allow custom - custom constraints to easily participate in the syntax. + Returns a ConstraintExpression that negates any + following constraint. - + - Returns the constraint provided as an argument - used to allow custom - custom constraints to easily participate in the syntax. + Returns a ConstraintExpression that negates any + following constraint. - + - Returns a constraint that tests two items for equality + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. - + - Returns a constraint that tests that two references are the same object + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. - + - Returns a constraint that tests whether the - actual value is greater than the suppled argument + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. - + - Returns a constraint that tests whether the - actual value is greater than or equal to the suppled argument + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. - + - Returns a constraint that tests whether the - actual value is greater than or equal to the suppled argument + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. - + - Returns a constraint that tests whether the - actual value is less than the suppled argument + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. - + - Returns a constraint that tests whether the - actual value is less than or equal to the suppled argument + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. - + - Returns a constraint that tests whether the - actual value is less than or equal to the suppled argument + Returns a constraint that tests for null - + - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. + Returns a constraint that tests for True - + - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. + Returns a constraint that tests for False - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + Returns a constraint that tests for a positive value - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + Returns a constraint that tests for a negative value - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + Returns a constraint that tests for NaN - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + Returns a constraint that tests for empty - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + Returns a constraint that tests whether a collection + contains all unique items. - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + Returns a constraint that tests whether an object graph is serializable in binary format. - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + Returns a constraint that tests whether an object graph is serializable in xml format. - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + Returns a constraint that tests whether a collection is ordered - + - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. Works + identically to Assert.That. + The actual value to test + A Constraint to be applied - + - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. Works + identically to Assert.That. + The actual value to test + A Constraint to be applied + The message to be displayed in case of failure - + - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. Works + identically to Assert.That. + The actual value to test + A Constraint to be applied + The message to be displayed in case of failure + Arguments to use in formatting the message - + - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically to + . + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message - + - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically to + . + The evaluated condition + The message to display if the condition is false - + - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically to . + The evaluated condition - + - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested - + - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + The message that will be displayed on failure - + - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + The actual value to test + A Constraint to be applied - + - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + The actual value to test + A Constraint to be applied + The message that will be displayed on failure - + - Returns a constraint that succeeds if the actual - value matches the Regex pattern supplied as an argument. + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + The actual value to test + A Constraint to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Returns a constraint that succeeds if the actual - value matches the Regex pattern supplied as an argument. + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + A TestDelegate to be executed + A ThrowsConstraint used in the test - + - Returns a constraint that tests whether the path provided - is the same as an expected path after canonicalization. + Returns a ListMapper based on a collection. + The original collection + - + - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. + Provides static methods to express the assumptions + that must be met for a test to give a meaningful + result. If an assumption is not met, the test + should produce an inconclusive result. - + - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + - + - Returns a constraint that tests whether the actual value falls - within a specified range. + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + - + - Returns a ConstraintExpression that negates any - following constraint. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + A Constraint expression to be applied + The actual value to test - + - Returns a ConstraintExpression that negates any - following constraint. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. - + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. + Asserts that a condition is true. If the condition is false the method throws + an . + The evaluated condition + The message to display if the condition is false - + - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. + Asserts that a condition is true. If the condition is false the + method throws an . + The evaluated condition - + - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested - + - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. - + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + The message that will be displayed on failure - + - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message - + - With is currently a NOP - reserved for future use. + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + A Constraint expression to be applied + The actual value to test - + - Returns a constraint that tests for null + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure - + - Returns a constraint that tests for True + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Returns a constraint that tests for False + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + A TestDelegate to be executed + A ThrowsConstraint used in the test - + - Returns a constraint that tests for a positive value + Waits for pending asynchronous operations to complete, if appropriate, + and returns a proper result of the invocation by unwrapping task results + The raw result of the method invocation + The unwrapped result, if necessary - + - Returns a constraint that tests for a negative value + A set of Assert methods operationg on one or more collections - + - Returns a constraint that tests for NaN + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + - + - Returns a constraint that tests for empty + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + - + - Returns a constraint that tests whether a collection - contains all unique items. + Asserts that all items contained in collection are of the type specified by expectedType. + IEnumerable containing objects to be considered + System.Type that all objects in collection must be instances of - + - Returns a constraint that tests whether an object graph is serializable in binary format. + Asserts that all items contained in collection are of the type specified by expectedType. + IEnumerable containing objects to be considered + System.Type that all objects in collection must be instances of + The message that will be displayed on failure - + - Returns a constraint that tests whether an object graph is serializable in xml format. + Asserts that all items contained in collection are of the type specified by expectedType. + IEnumerable containing objects to be considered + System.Type that all objects in collection must be instances of + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Returns a constraint that tests whether a collection is ordered + Asserts that all items contained in collection are not equal to null. + IEnumerable containing objects to be considered - + - Helper class with properties and methods that supply - a number of constraints used in Asserts. + Asserts that all items contained in collection are not equal to null. + IEnumerable containing objects to be considered + The message that will be displayed on failure - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding only if a specified number of them succeed. + Asserts that all items contained in collection are not equal to null. + IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. + Ensures that every object contained in collection exists within the collection + once and only once. + IEnumerable of objects to be considered - + - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. + Ensures that every object contained in collection exists within the collection + once and only once. + IEnumerable of objects to be considered + The message that will be displayed on failure - + - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. + Ensures that every object contained in collection exists within the collection + once and only once. + IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Returns a constraint that tests two items for equality + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered - + - Returns a constraint that tests that two references are the same object + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + If comparer is not null then it will be used to compare the objects. + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable - + - Returns a constraint that tests whether the - actual value is greater than the suppled argument + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure - + - Returns a constraint that tests whether the - actual value is greater than or equal to the suppled argument + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + If comparer is not null then it will be used to compare the objects. + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure - + - Returns a constraint that tests whether the - actual value is greater than or equal to the suppled argument + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Returns a constraint that tests whether the - actual value is less than the suppled argument + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + If comparer is not null then it will be used to compare the objects. + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Returns a constraint that tests whether the - actual value is less than or equal to the suppled argument + Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered - + - Returns a constraint that tests whether the - actual value is less than or equal to the suppled argument + Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure - + - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. + Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. + Asserts that expected and actual are not exactly equal. + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + Asserts that expected and actual are not exactly equal. + If comparer is not null then it will be used to compare the objects. + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + Asserts that expected and actual are not exactly equal. + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + Asserts that expected and actual are not exactly equal. + If comparer is not null then it will be used to compare the objects. + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + Asserts that expected and actual are not exactly equal. + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + Asserts that expected and actual are not exactly equal. + If comparer is not null then it will be used to compare the objects. + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + Asserts that expected and actual are not equivalent. + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + Asserts that expected and actual are not equivalent. + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + Asserts that expected and actual are not equivalent. + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. + Asserts that collection contains actual as an item. + IEnumerable of objects to be considered + Object to be found within collection - + - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. + Asserts that collection contains actual as an item. + IEnumerable of objects to be considered + Object to be found within collection + The message that will be displayed on failure - + - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. + Asserts that collection contains actual as an item. + IEnumerable of objects to be considered + Object to be found within collection + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. + Asserts that collection does not contain actual as an item. + IEnumerable of objects to be considered + Object that cannot exist within collection - + - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. + Asserts that collection does not contain actual as an item. + IEnumerable of objects to be considered + Object that cannot exist within collection + The message that will be displayed on failure - + - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. + Asserts that collection does not contain actual as an item. + IEnumerable of objects to be considered + Object that cannot exist within collection + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. + Asserts that superset is not a subject of subset. + The IEnumerable superset to be considered + The IEnumerable subset to be considered - + - Returns a constraint that fails if the actual - value contains the substring supplied as an argument. + Asserts that superset is not a subject of subset. + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure - + - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. + Asserts that superset is not a subject of subset. + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. + Asserts that superset is a subset of subset. + The IEnumerable superset to be considered + The IEnumerable subset to be considered - + - Returns a constraint that fails if the actual - value starts with the substring supplied as an argument. + Asserts that superset is a subset of subset. + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure - + - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. + Asserts that superset is a subset of subset. + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message - + - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. + Assert that an array, list or other collection is empty + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message - + - Returns a constraint that fails if the actual - value ends with the substring supplied as an argument. + Assert that an array, list or other collection is empty + An array, list or other collection implementing IEnumerable + The message to be displayed on failure - + - Returns a constraint that succeeds if the actual - value matches the Regex pattern supplied as an argument. + Assert that an array,list or other collection is empty + An array, list or other collection implementing IEnumerable - + - Returns a constraint that succeeds if the actual - value matches the Regex pattern supplied as an argument. + Assert that an array, list or other collection is empty + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message - + - Returns a constraint that fails if the actual - value matches the pattern supplied as an argument. + Assert that an array, list or other collection is empty + An array, list or other collection implementing IEnumerable + The message to be displayed on failure - + - Returns a constraint that tests whether the path provided - is the same as an expected path after canonicalization. + Assert that an array,list or other collection is empty + An array, list or other collection implementing IEnumerable - + - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. + Assert that an array, list or other collection is ordered + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message - + - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. + Assert that an array, list or other collection is ordered + An array, list or other collection implementing IEnumerable + The message to be displayed on failure - + - Returns a constraint that tests whether the actual value falls - within a specified range. + Assert that an array, list or other collection is ordered + An array, list or other collection implementing IEnumerable - + - Returns a ConstraintExpression that negates any - following constraint. + Assert that an array, list or other collection is ordered + An array, list or other collection implementing IEnumerable + A custom comparer to perform the comparisons + The message to be displayed on failure + Arguments to be used in formatting the message - + - Returns a ConstraintExpression that negates any - following constraint. + Assert that an array, list or other collection is ordered + An array, list or other collection implementing IEnumerable + A custom comparer to perform the comparisons + The message to be displayed on failure - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. + Assert that an array, list or other collection is ordered + An array, list or other collection implementing IEnumerable + A custom comparer to perform the comparisons - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. + Helper class with properties and methods that supply + a number of constraints used in Asserts. - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. - + - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. - + - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. + Summary description for DirectoryAssert - + - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + - + - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + - + - Returns a constraint that tests for null + We don't actually want any instances of this object, but some people + like to inherit from it to add other static methods. Hence, the + protected constructor disallows any instances of this object. - + - Returns a constraint that tests for True + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + A directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message - + - Returns a constraint that tests for False + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + A directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal - + - Returns a constraint that tests for a positive value + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + A directory containing the value that is expected + A directory containing the actual value - + - Returns a constraint that tests for a negative value + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + A directory path string containing the value that is expected + A directory path string containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message - + - Returns a constraint that tests for NaN + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + A directory path string containing the value that is expected + A directory path string containing the actual value + The message to display if directories are not equal - + - Returns a constraint that tests for empty + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + A directory path string containing the value that is expected + A directory path string containing the actual value - + - Returns a constraint that tests whether a collection - contains all unique items. + Asserts that two directories are not equal. If they are equal + an is thrown. + A directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message - + - Returns a constraint that tests whether an object graph is serializable in binary format. + Asserts that two directories are not equal. If they are equal + an is thrown. + A directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal - + - Returns a constraint that tests whether an object graph is serializable in xml format. + Asserts that two directories are not equal. If they are equal + an is thrown. + A directory containing the value that is expected + A directory containing the actual value - + - Returns a constraint that tests whether a collection is ordered + Asserts that two directories are not equal. If they are equal + an is thrown. + A directory path string containing the value that is expected + A directory path string containing the actual value + The message to display if directories are equal + Arguments to be used in formatting the message - + - The ConstraintOperator class is used internally by a - ConstraintBuilder to represent an operator that - modifies or combines constraints. - - Constraint operators use left and right precedence - values to determine whether the top operator on the - stack should be reduced before pushing a new operator. + Asserts that two directories are not equal. If they are equal + an is thrown. + A directory path string containing the value that is expected + A directory path string containing the actual value + The message to display if directories are equal - + - The precedence value used when the operator - is about to be pushed to the stack. + Asserts that two directories are not equal. If they are equal + an is thrown. + A directory path string containing the value that is expected + A directory path string containing the actual value - + - The precedence value used when the operator - is on the top of the stack. + Asserts that the directory is empty. If it is not empty + an is thrown. + A directory to search + The message to display if directories are not equal + Arguments to be used in formatting the message - + - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. + Asserts that the directory is empty. If it is not empty + an is thrown. - + A directory to search + The message to display if directories are not equal - + - The syntax element preceding this operator + Asserts that the directory is empty. If it is not empty + an is thrown. + A directory to search - + - The syntax element folowing this operator + Asserts that the directory is empty. If it is not empty + an is thrown. + A directory to search + The message to display if directories are not equal + Arguments to be used in formatting the message - + - The precedence value used when the operator - is about to be pushed to the stack. + Asserts that the directory is empty. If it is not empty + an is thrown. + A directory to search + The message to display if directories are not equal - + - The precedence value used when the operator - is on the top of the stack. + Asserts that the directory is empty. If it is not empty + an is thrown. + A directory to search - + - PrefixOperator takes a single constraint and modifies - it's action in some way. + Asserts that the directory is not empty. If it is empty + an is thrown. + A directory to search + The message to display if directories are not equal + Arguments to be used in formatting the message - + - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. + Asserts that the directory is not empty. If it is empty + an is thrown. - + A directory to search + The message to display if directories are not equal - + - Returns the constraint created by applying this - prefix to another constraint. + Asserts that the directory is not empty. If it is empty + an is thrown. - - + A directory to search - + - Negates the test of the constraint it wraps. + Asserts that the directory is not empty. If it is empty + an is thrown. + A directory to search + The message to display if directories are not equal + Arguments to be used in formatting the message - + - Constructs a new NotOperator + Asserts that the directory is not empty. If it is empty + an is thrown. + A directory to search + The message to display if directories are not equal - + - Returns a NotConstraint applied to its argument. + Asserts that the directory is not empty. If it is empty + an is thrown. + A directory to search - + - Abstract base for operators that indicate how to - apply a constraint to items in a collection. + Asserts that path contains actual as a subdirectory or + an is thrown. + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + Arguments to be used in formatting the message - + - Constructs a CollectionOperator + Asserts that path contains actual as a subdirectory or + an is thrown. + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path - + - Represents a constraint that succeeds if all the - members of a collection match a base constraint. + Asserts that path contains actual as a subdirectory or + an is thrown. + A directory to search + sub-directory asserted to exist under directory - + - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - they all succeed. + Asserts that path contains actual as a subdirectory or + an is thrown. + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + Arguments to be used in formatting the message - + - Represents a constraint that succeeds if any of the - members of a collection match a base constraint. + Asserts that path contains actual as a subdirectory or + an is thrown. + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path - + - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - any of them succeed. + Asserts that path contains actual as a subdirectory or + an is thrown. + A directory to search + sub-directory asserted to exist under directory - + - Represents a constraint that succeeds if none of the - members of a collection match a base constraint. + Asserts that path does not contain actual as a subdirectory or + an is thrown. + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + Arguments to be used in formatting the message - + - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - none of them succeed. + Asserts that path does not contain actual as a subdirectory or + an is thrown. + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path - + - Represents a constraint that succeeds if the specified - count of members of a collection match a base constraint. + Asserts that path does not contain actual as a subdirectory or + an is thrown. + A directory to search + sub-directory asserted to exist under directory - + - Construct an ExactCountOperator for a specified count + Asserts that path does not contain actual as a subdirectory or + an is thrown. - The expected count + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + Arguments to be used in formatting the message - + - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - none of them succeed. + Asserts that path does not contain actual as a subdirectory or + an is thrown. + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path - + - Represents a constraint that simply wraps the - constraint provided as an argument, without any - further functionality, but which modifes the - order of evaluation because of its precedence. + Asserts that path does not contain actual as a subdirectory or + an is thrown. + A directory to search + sub-directory asserted to exist under directory - + - Constructor for the WithOperator + Summary description for FileAssert. - + - Returns a constraint that wraps its argument + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + - + - Abstract base class for operators that are able to reduce to a - constraint whether or not another syntactic element follows. + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + - + - Operator used to test for the presence of a named Property - on an object and optionally apply further tests to the - value of that property. + We don't actually want any instances of this object, but some people + like to inherit from it to add other static methods. Hence, the + protected constructor disallows any instances of this object. - + - Constructs a PropOperator for a particular named property + Verifies that two Streams are equal. Two Streams are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + The expected Stream + The actual Stream + The message to display if Streams are not equal + Arguments to be used in formatting the message - + - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. + Verifies that two Streams are equal. Two Streams are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. - + The expected Stream + The actual Stream + The message to display if objects are not equal - + - Gets the name of the property to which the operator applies + Verifies that two Streams are equal. Two Streams are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + The expected Stream + The actual Stream - + - Operator that tests for the presence of a particular attribute - on a type and optionally applies further tests to the attribute. + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + A file containing the value that is expected + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message - + - Construct an AttributeOperator for a particular Type + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. - The Type of attribute tested + A file containing the value that is expected + A file containing the actual value + The message to display if objects are not equal - + - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + A file containing the value that is expected + A file containing the actual value - + - Operator that tests that an exception is thrown and - optionally applies further tests to the exception. + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message - + - Construct a ThrowsOperator + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if objects are not equal - + - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + The path to a file containing the value that is expected + The path to a file containing the actual value - + - Abstract base class for all binary operators + Asserts that two Streams are not equal. If they are equal + an is thrown. + The expected Stream + The actual Stream + The message to be displayed when the two Stream are the same. + Arguments to be used in formatting the message - + - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. + Asserts that two Streams are not equal. If they are equal + an is thrown. - + The expected Stream + The actual Stream + The message to be displayed when the Streams are the same. - + - Abstract method that produces a constraint by applying - the operator to its left and right constraint arguments. + Asserts that two Streams are not equal. If they are equal + an is thrown. + The expected Stream + The actual Stream - + - Gets the left precedence of the operator + Asserts that two files are not equal. If they are equal + an is thrown. + A file containing the value that is expected + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message - + - Gets the right precedence of the operator + Asserts that two files are not equal. If they are equal + an is thrown. + A file containing the value that is expected + A file containing the actual value + The message to display if objects are not equal - + - Operator that requires both it's arguments to succeed + Asserts that two files are not equal. If they are equal + an is thrown. + A file containing the value that is expected + A file containing the actual value - + - Construct an AndOperator + Asserts that two files are not equal. If they are equal + an is thrown. + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message - + - Apply the operator to produce an AndConstraint + Asserts that two files are not equal. If they are equal + an is thrown. + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if objects are not equal - + - Operator that requires at least one of it's arguments to succeed + Asserts that two files are not equal. If they are equal + an is thrown. + The path to a file containing the value that is expected + The path to a file containing the actual value - + - Construct an OrOperator + GlobalSettings is a place for setting default values used + by the framework in performing asserts. - + - Apply the operator to produce an OrConstraint + Default tolerance for floating point equality - + - ContainsConstraint tests a whether a string contains a substring - or a collection contains an object. It postpones the decision of - which test to use until the type of the actual argument is known. - This allows testing whether a string is contained in a collection - or as a substring of another string using the same syntax. + Class used to guard against unexpected argument values + by throwing an appropriate exception. - + - Initializes a new instance of the class. + Throws an exception if an argument is null - The expected. + The value to be tested + The name of the argument - + - Test whether the constraint is satisfied by a given value + Throws an exception if a string argument is null or empty - The value to be tested - True for success, false for failure + The value to be tested + The name of the argument - + - Write the constraint description to a MessageWriter + Helper class with properties and methods that supply + a number of constraints used in Asserts. - The writer on which the description is displayed - + - Flag the constraint to use the supplied IComparer object. + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. - The IComparer object to use. - Self. - + - Flag the constraint to use the supplied IComparer object. + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. - The IComparer object to use. - Self. - + - Flag the constraint to use the supplied Comparison object. + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. - The IComparer object to use. - Self. - + - Flag the constraint to use the supplied IEqualityComparer object. + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. - The IComparer object to use. - Self. - + - Flag the constraint to use the supplied IEqualityComparer object. + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. - The IComparer object to use. - Self. - + - Flag the constraint to ignore case and return self. + Returns a ConstraintExpression that negates any + following constraint. - + - Applies a delay to the match so that a match can be evaluated in the future. + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. - + - Creates a new DelayedConstraint + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. - The inner constraint two decorate - The time interval after which the match is performed - If the value of is less than 0 - + - Creates a new DelayedConstraint + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. - The inner constraint two decorate - The time interval after which the match is performed - The time interval used for polling - If the value of is less than 0 - + - Test whether the constraint is satisfied by a given value + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. - The value to be tested - True for if the base constraint fails, false if it succeeds - + - Test whether the constraint is satisfied by a delegate + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. - The delegate whose value is to be tested - True for if the base constraint fails, false if it succeeds - + - Test whether the constraint is satisfied by a given reference. - Overridden to wait for the specified delay period before - calling the base constraint with the dereferenced value. + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. - A reference to the value to be tested - True for success, false for failure - + - Write the constraint description to a MessageWriter + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. - The writer on which the description is displayed - + - Write the actual value for a failing constraint test to a MessageWriter. + Interface implemented by a user fixture in order to + validate any expected exceptions. It is only called + for test methods marked with the ExpectedException + attribute. - The writer on which the actual value is displayed - + - Returns the string representation of the constraint. + Method to handle an expected exception + The exception to be handled - + - EmptyDirectoryConstraint is used to test that a directory is empty + Helper class with properties and methods that supply + a number of constraints used in Asserts. - + - Test whether the constraint is satisfied by a given value + Returns a constraint that tests two items for equality - The value to be tested - True for success, false for failure - + - Write the constraint description to a MessageWriter + Returns a constraint that tests that two references are the same object - The writer on which the description is displayed - + - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. + Returns a constraint that tests whether the + actual value is greater than the suppled argument - The writer on which the actual value is displayed - + - EmptyConstraint tests a whether a string or collection is empty, - postponing the decision about which test is applied until the - type of the actual argument is known. + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument - + - Test whether the constraint is satisfied by a given value + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument - The value to be tested - True for success, false for failure - + - Write the constraint description to a MessageWriter + Returns a constraint that tests whether the + actual value is less than the suppled argument - The writer on which the description is displayed - + - EqualConstraint is able to compare an actual value with the - expected value provided in its constructor. Two objects are - considered equal if both are null, or if both have the same - value. NUnit has special semantics for some object types. + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument - + - If true, strings in error messages will be clipped + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument - + - NUnitEqualityComparer used to test equality. + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. - + - Initializes a new instance of the class. + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. - The expected value. - + - Flag the constraint to use a tolerance when determining equality. + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. - Tolerance value to be used - Self. - + - Flag the constraint to use the supplied IComparer object. + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. - The IComparer object to use. - Self. - + - Flag the constraint to use the supplied IComparer object. + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. - The IComparer object to use. - Self. - + - Flag the constraint to use the supplied IComparer object. + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. - The IComparer object to use. - Self. - + - Flag the constraint to use the supplied Comparison object. + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. - The IComparer object to use. - Self. - + - Flag the constraint to use the supplied IEqualityComparer object. + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. - The IComparer object to use. - Self. - + - Flag the constraint to use the supplied IEqualityComparer object. + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. - The IComparer object to use. - Self. - + - Test whether the constraint is satisfied by a given value + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. - The value to be tested - True for success, false for failure - + - Write a failure message. Overridden to provide custom - failure messages for EqualConstraint. + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. - The MessageWriter to write to - + - Write description of this constraint + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. - The MessageWriter to write to - + - Display the failure information for two collections that did not match. + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. - The MessageWriter on which to display - The expected collection. - The actual collection - The depth of this failure in a set of nested collections - + - Displays a single line showing the types and sizes of the expected - and actual enumerations, collections or arrays. If both are identical, - the value is only shown once. + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. - The MessageWriter on which to display - The expected collection or array - The actual collection or array - The indentation level for the message line - + - Displays a single line showing the point in the expected and actual - arrays at which the comparison failed. If the arrays have different - structures or dimensions, both values are shown. + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. - The MessageWriter on which to display - The expected array - The actual array - Index of the failure point in the underlying collections - The indentation level for the message line - + - Display the failure information for two IEnumerables that did not match. + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. - The MessageWriter on which to display - The expected enumeration. - The actual enumeration - The depth of this failure in a set of nested collections - + - Flag the constraint to ignore case and return self. + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. - + - Flag the constraint to suppress string clipping - and return self. + Returns a constraint that tests whether the path provided + is under an expected path after canonicalization. - + - Flag the constraint to compare arrays as collections - and return self. + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. - + - Switches the .Within() modifier to interpret its tolerance as - a distance in representable values (see remarks). + Returns a constraint that tests whether the actual value falls + within a specified range. - Self. - - Ulp stands for "unit in the last place" and describes the minimum - amount a given value can change. For any integers, an ulp is 1 whole - digit. For floating point values, the accuracy of which is better - for smaller numbers and worse for larger numbers, an ulp depends - on the size of the number. Using ulps for comparison of floating - point results instead of fixed tolerances is safer because it will - automatically compensate for the added inaccuracy of larger numbers. - - + - Switches the .Within() modifier to interpret its tolerance as - a percentage that the actual values is allowed to deviate from - the expected value. + Returns a ConstraintExpression that negates any + following constraint. - Self - + - Causes the tolerance to be interpreted as a TimeSpan in days. + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. - Self - + - Causes the tolerance to be interpreted as a TimeSpan in hours. + Returns a constraint that tests for null - Self - + - Causes the tolerance to be interpreted as a TimeSpan in minutes. + Returns a constraint that tests for True - Self - + - Causes the tolerance to be interpreted as a TimeSpan in seconds. + Returns a constraint that tests for False - Self - + - Causes the tolerance to be interpreted as a TimeSpan in milliseconds. + Returns a constraint that tests for a positive value - Self - + - Causes the tolerance to be interpreted as a TimeSpan in clock ticks. + Returns a constraint that tests for a negative value - Self - + - EqualityAdapter class handles all equality comparisons - that use an IEqualityComparer, IEqualityComparer<T> - or a ComparisonAdapter. + Returns a constraint that tests for NaN - + - Compares two objects, returning true if they are equal + Returns a constraint that tests for empty - + - Returns true if the two objects can be compared by this adapter. - The base adapter cannot handle IEnumerables except for strings. + Returns a constraint that tests whether a collection + contains all unique items. - + - Returns an EqualityAdapter that wraps an IComparer. + Returns a constraint that tests whether an object graph is serializable in binary format. - + - Returns an EqualityAdapter that wraps an IEqualityComparer. + Returns a constraint that tests whether an object graph is serializable in xml format. - + - Returns an EqualityAdapter that wraps an IEqualityComparer<T>. + Returns a constraint that tests whether a collection is ordered - + - Returns an EqualityAdapter that wraps an IComparer<T>. + The ITestCaseData interface is implemented by a class + that is able to return complete testcases for use by + a parameterized test method. + + NOTE: This interface is used in both the framework + and the core, even though that results in two different + types. However, sharing the source code guarantees that + the various implementations will be compatible and that + the core is able to reflect successfully over the + framework implementations of ITestCaseData. - + - Returns an EqualityAdapter that wraps a Comparison<T>. + Gets the argument list to be provided to the test - + - EqualityAdapter that wraps an IComparer. + Gets the expected result - + - Returns true if the two objects can be compared by this adapter. - Generic adapter requires objects of the specified type. + Indicates whether a result has been specified. + This is necessary because the result may be + null, so it's value cannot be checked. - + - EqualityAdapter that wraps an IComparer. + Gets the expected exception Type - - Helper routines for working with floating point numbers - - - The floating point comparison code is based on this excellent article: - http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm - - - "ULP" means Unit in the Last Place and in the context of this library refers to - the distance between two adjacent floating point numbers. IEEE floating point - numbers can only represent a finite subset of natural numbers, with greater - accuracy for smaller numbers and lower accuracy for very large numbers. - - - If a comparison is allowed "2 ulps" of deviation, that means the values are - allowed to deviate by up to 2 adjacent floating point values, which might be - as low as 0.0000001 for small numbers or as high as 10.0 for large numbers. - - + + + Gets the FullName of the expected exception + - - Compares two floating point values for equality - First floating point value to be compared - Second floating point value t be compared - - Maximum number of representable floating point values that are allowed to - be between the left and the right floating point values - - True if both numbers are equal or close to being equal - - - Floating point values can only represent a finite subset of natural numbers. - For example, the values 2.00000000 and 2.00000024 can be stored in a float, - but nothing inbetween them. - - - This comparison will count how many possible floating point values are between - the left and the right number. If the number of possible values between both - numbers is less than or equal to maxUlps, then the numbers are considered as - being equal. - - - Implementation partially follows the code outlined here: - http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ - - - - - Compares two double precision floating point values for equality - First double precision floating point value to be compared - Second double precision floating point value t be compared - - Maximum number of representable double precision floating point values that are - allowed to be between the left and the right double precision floating point values - - True if both numbers are equal or close to being equal - - - Double precision floating point values can only represent a limited series of - natural numbers. For example, the values 2.0000000000000000 and 2.0000000000000004 - can be stored in a double, but nothing inbetween them. - - - This comparison will count how many possible double precision floating point - values are between the left and the right number. If the number of possible - values between both numbers is less than or equal to maxUlps, then the numbers - are considered as being equal. - - - Implementation partially follows the code outlined here: - http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ - - - - + - Reinterprets the memory contents of a floating point value as an integer value + Gets the name to be used for the test - - Floating point value whose memory contents to reinterpret - - - The memory contents of the floating point value interpreted as an integer - - + - Reinterprets the memory contents of a double precision floating point - value as an integer value + Gets the description of the test - - Double precision floating point value whose memory contents to reinterpret - - - The memory contents of the double precision floating point value - interpreted as an integer - - + - Reinterprets the memory contents of an integer as a floating point value + Gets a value indicating whether this is ignored. - Integer value whose memory contents to reinterpret - - The memory contents of the integer value interpreted as a floating point value - + true if ignored; otherwise, false. - + - Reinterprets the memory contents of an integer value as a double precision - floating point value + Gets a value indicating whether this is explicit. - Integer whose memory contents to reinterpret - - The memory contents of the integer interpreted as a double precision - floating point value - - - - Union of a floating point variable and an integer - - - The union's value as a floating point variable - - - The union's value as an integer - - - The union's value as an unsigned integer - - - Union of a double precision floating point variable and a long - - - The union's value as a double precision floating point variable - - - The union's value as a long - - - The union's value as an unsigned long + true if explicit; otherwise, false. - + - Tests whether a value is greater than the value supplied to its constructor + Gets the ignore reason. + The ignore reason. - + - The value against which a comparison is to be made + The Iz class is a synonym for Is intended for use in VB, + which regards Is as a keyword. - + - Initializes a new instance of the class. + The List class is a helper class with properties and methods + that supply a number of constraints used with lists and collections. - The expected value. - + - Write the constraint description to a MessageWriter + List.Map returns a ListMapper, which can be used to map + the original collection to another collection. - The writer on which the description is displayed + + - + - Test whether the constraint is satisfied by a given value + ListMapper is used to transform a collection used as an actual argument + producing another collection to be used in the assertion. - The value to be tested - True for success, false for failure - + - Tests whether a value is greater than or equal to the value supplied to its constructor + Construct a ListMapper based on a collection + The collection to be transformed - + - The value against which a comparison is to be made + Produces a collection containing all the values of a property + The collection of property values + - + - Initializes a new instance of the class. + Randomizer returns a set of random values in a repeatable + way, to allow re-running of tests if necessary. - The expected value. - + - Write the constraint description to a MessageWriter + Get a randomizer for a particular member, returning + one that has already been created if it exists. + This ensures that the same values are generated + each time the tests are reloaded. - The writer on which the description is displayed - + - Test whether the constraint is satisfied by a given value + Get a randomizer for a particular parameter, returning + one that has already been created if it exists. + This ensures that the same values are generated + each time the tests are reloaded. - The value to be tested - True for success, false for failure - + - Tests whether a value is less than the value supplied to its constructor + Construct a randomizer using a random seed - + - The value against which a comparison is to be made + Construct a randomizer using a specified seed - + - Initializes a new instance of the class. + Return an array of random doubles between 0.0 and 1.0. - The expected value. + + - + - Write the constraint description to a MessageWriter + Return an array of random doubles with values in a specified range. - The writer on which the description is displayed - + - Test whether the constraint is satisfied by a given value + Return an array of random ints with values in a specified range. - The value to be tested - True for success, false for failure - + - Tests whether a value is less than or equal to the value supplied to its constructor + Get a random seed for use in creating a randomizer. - + - The value against which a comparison is to be made + The SpecialValue enum is used to represent TestCase arguments + that cannot be used as arguments to an Attribute. - + - Initializes a new instance of the class. + Null represents a null value, which cannot be used as an + argument to an attribute under .NET 1.x - The expected value. - + - Write the constraint description to a MessageWriter + Basic Asserts on strings. - The writer on which the description is displayed - + - Test whether the constraint is satisfied by a given value + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. - The value to be tested - True for success, false for failure + + - + - MessageWriter is the abstract base for classes that write - constraint descriptions and messages in some form. The - class has separate methods for writing various components - of a message, allowing implementations to tailor the - presentation as needed. + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + - + - Construct a MessageWriter given a culture + Asserts that a string is found within another string. + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message - + - Method to write single line message with optional args, usually - written to precede the general failure message. + Asserts that a string is found within another string. - The message to be written - Any arguments used in formatting the message + The expected string + The string to be examined + The message to display in case of failure - + - Method to write single line message with optional args, usually - written to precede the general failure message, at a givel - indentation level. + Asserts that a string is found within another string. - The indentation level of the message - The message to be written - Any arguments used in formatting the message + The expected string + The string to be examined - + - Display Expected and Actual lines for a constraint. This - is called by MessageWriter's default implementation of - WriteMessageTo and provides the generic two-line display. + Asserts that a string is not found within another string. - The constraint that failed + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message - + - Display Expected and Actual lines for given values. This - method may be called by constraints that need more control over - the display of actual and expected values than is provided - by the default implementation. + Asserts that a string is found within another string. - The expected value - The actual value causing the failure + The expected string + The string to be examined + The message to display in case of failure - + - Display Expected and Actual lines for given values, including - a tolerance value on the Expected line. + Asserts that a string is found within another string. - The expected value - The actual value causing the failure - The tolerance within which the test was made + The expected string + The string to be examined - + - Display the expected and actual string values on separate lines. - If the mismatch parameter is >=0, an additional line is displayed - line containing a caret that points to the mismatch point. + Asserts that a string starts with another string. - The expected string value - The actual string value - The point at which the strings don't match or -1 - If true, case is ignored in locating the point where the strings differ - If true, the strings should be clipped to fit the line + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message - + - Writes the text for a connector. + Asserts that a string starts with another string. - The connector. + The expected string + The string to be examined + The message to display in case of failure - + - Writes the text for a predicate. + Asserts that a string starts with another string. - The predicate. + The expected string + The string to be examined - + - Writes the text for an expected value. + Asserts that a string does not start with another string. - The expected value. + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message - + - Writes the text for a modifier + Asserts that a string does not start with another string. - The modifier. + The expected string + The string to be examined + The message to display in case of failure - + - Writes the text for an actual value. + Asserts that a string does not start with another string. - The actual value. + The expected string + The string to be examined - + - Writes the text for a generalized value. + Asserts that a string ends with another string. - The value. + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message - + - Writes the text for a collection value, - starting at a particular point, to a max length + Asserts that a string ends with another string. - The collection containing elements to write. - The starting point of the elements to write - The maximum number of elements to write + The expected string + The string to be examined + The message to display in case of failure - + - Abstract method to get the max line length + Asserts that a string ends with another string. + The expected string + The string to be examined - + - Static methods used in creating messages + Asserts that a string does not end with another string. + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message - + - Static string used when strings are clipped + Asserts that a string does not end with another string. + The expected string + The string to be examined + The message to display in case of failure - + - Returns the representation of a type as used in NUnitLite. - This is the same as Type.ToString() except for arrays, - which are displayed with their declared sizes. + Asserts that a string does not end with another string. - - + The expected string + The string to be examined - + - Converts any control characters in a string - to their escaped representation. + Asserts that two strings are equal, without regard to case. - The string to be converted - The converted string + The expected string + The actual string + The message to display in case of failure + Arguments used in formatting the message - + - Return the a string representation for a set of indices into an array + Asserts that two strings are equal, without regard to case. - Array of indices for which a string is needed + The expected string + The actual string + The message to display in case of failure - + - Get an array of indices representing the point in a enumerable, - collection or array corresponding to a single int index into the - collection. + Asserts that two strings are equal, without regard to case. - The collection to which the indices apply - Index in the collection - Array of indices + The expected string + The actual string - + - Clip a string to a given length, starting at a particular offset, returning the clipped - string with ellipses representing the removed parts + Asserts that two strings are not equal, without regard to case. - The string to be clipped - The maximum permitted length of the result string - The point at which to start clipping - The clipped string + The expected string + The actual string + The message to display in case of failure + Arguments used in formatting the message - + - Clip the expected and actual strings in a coordinated fashion, - so that they may be displayed together. + Asserts that two strings are Notequal, without regard to case. - - - - + The expected string + The actual string + The message to display in case of failure - + - Shows the position two strings start to differ. Comparison - starts at the start index. + Asserts that two strings are not equal, without regard to case. The expected string The actual string - The index in the strings at which comparison should start - Boolean indicating whether case should be ignored - -1 if no mismatch found, or the index where mismatch found - + - The Numerics class contains common operations on numeric values. + Asserts that a string matches an expected regular expression pattern. + The regex pattern to be matched + The actual string + The message to display in case of failure + Arguments used in formatting the message - + - Checks the type of the object, returning true if - the object is a numeric type. + Asserts that a string matches an expected regular expression pattern. - The object to check - true if the object is a numeric type + The regex pattern to be matched + The actual string + The message to display in case of failure - + - Checks the type of the object, returning true if - the object is a floating point numeric type. + Asserts that a string matches an expected regular expression pattern. - The object to check - true if the object is a floating point numeric type + The regex pattern to be matched + The actual string - + - Checks the type of the object, returning true if - the object is a fixed point numeric type. + Asserts that a string does not match an expected regular expression pattern. - The object to check - true if the object is a fixed point numeric type + The regex pattern to be used + The actual string + The message to display in case of failure + Arguments used in formatting the message - + - Test two numeric values for equality, performing the usual numeric - conversions and using a provided or default tolerance. If the tolerance - provided is Empty, this method may set it to a default tolerance. + Asserts that a string does not match an expected regular expression pattern. - The expected value - The actual value - A reference to the tolerance in effect - True if the values are equal + The regex pattern to be used + The actual string + The message to display in case of failure - + - Compare two numeric values, performing the usual numeric conversions. + Asserts that a string does not match an expected regular expression pattern. - The expected value - The actual value - The relationship of the values to each other + The regex pattern to be used + The actual string - + - NUnitComparer encapsulates NUnit's default behavior - in comparing two objects. + The TestCaseData class represents a set of arguments + and other parameter info to be used for a parameterized + test case. It provides a number of instance modifiers + for use in initializing the test case. + + Note: Instance modifiers are getters that return + the same instance after modifying it's state. - + - Compares two objects + The argument list to be provided to the test - - - - + - Returns the default NUnitComparer. + The expected result to be returned - + - Generic version of NUnitComparer + Set to true if this has an expected result - - + - Compare two objects of the same type + The expected exception Type - + - NUnitEqualityComparer encapsulates NUnit's handling of - equality tests between objects. + The FullName of the expected exception - + - + The name to be used for the test - + - Compares two objects for equality within a tolerance + The description of the test - The first object to compare - The second object to compare - The tolerance to use in the comparison - - + - If true, all string comparisons will ignore case + A dictionary of properties, used to add information + to tests without requiring the class to change. - + - If true, arrays will be treated as collections, allowing - those of different dimensions to be compared + If true, indicates that the test case is to be ignored - + - Comparison objects used in comparisons for some constraints. + If true, indicates that the test case is marked explicit - + - Compares two objects for equality within a tolerance. + The reason for ignoring a test case - + - Helper method to compare two arrays + Initializes a new instance of the class. + The arguments. - + - Method to compare two DirectoryInfo objects + Initializes a new instance of the class. - first directory to compare - second directory to compare - true if equivalent, false if not + The argument. - + - Returns the default NUnitEqualityComparer + Initializes a new instance of the class. + The first argument. + The second argument. - + - Gets and sets a flag indicating whether case should - be ignored in determining equality. + Initializes a new instance of the class. + The first argument. + The second argument. + The third argument. - + - Gets and sets a flag indicating that arrays should be - compared as collections, without regard to their shape. + Sets the expected result for the test + The expected result + A modified TestCaseData - + - Gets and sets an external comparer to be used to - test for equality. It is applied to members of - collections, in place of NUnit's own logic. + Sets the expected exception type for the test + Type of the expected exception. + The modified TestCaseData instance - + - Gets the list of failure points for the last Match performed. + Sets the expected exception type for the test + FullName of the expected exception. + The modified TestCaseData instance - + - FailurePoint class represents one point of failure - in an equality test. + Sets the name of the test case + The modified TestCaseData instance - + - The location of the failure + Sets the description for the test case + being constructed. + The description. + The modified TestCaseData instance. - + - The expected value + Applies a category to the test + + - + - The actual value + Applies a named property to the test + + + - + - Indicates whether the expected value is valid + Applies a named property to the test + + + - + - Indicates whether the actual value is valid + Applies a named property to the test + + + - + - PathConstraint serves as the abstract base of constraints - that operate on paths and provides several helper methods. + Ignores this TestCase. + - + - The expected path used in the constraint + Ignores this TestCase, specifying the reason. + The reason. + - + - The actual path being tested + Marks this TestCase as Explicit + - + - Flag indicating whether a caseInsensitive comparison should be made + Marks this TestCase as Explicit, specifying the reason. + The reason. + - + - Construct a PathConstraint for a give expected path + Gets the argument list to be provided to the test - The expected path - + - Test whether the constraint is satisfied by a given value + Gets the expected result - The value to be tested - True for success, false for failure - + - Returns true if the expected path and actual path match + Returns true if the result has been set - + - Returns the string representation of this constraint + Gets the expected exception Type - + - Canonicalize the provided path + Gets the FullName of the expected exception - - The path in standardized form - + - Test whether two paths are the same + Gets the name to be used for the test - The first path - The second path - Indicates whether case should be ignored - - + - Test whether one path is under another path + Gets the description of the test - The first path - supposed to be the parent path - The second path - supposed to be the child path - Indicates whether case should be ignored - - + - Test whether one path is the same as or under another path + Gets a value indicating whether this is ignored. - The first path - supposed to be the parent path - The second path - supposed to be the child path - + true if ignored; otherwise, false. - + - Modifies the current instance to be case-insensitve - and returns it. + Gets a value indicating whether this is explicit. + true if explicit; otherwise, false. - + - Modifies the current instance to be case-sensitve - and returns it. + Gets the ignore reason. + The ignore reason. - + - Summary description for SamePathConstraint. + Gets a list of categories associated with this test. - + - Initializes a new instance of the class. + Gets the property dictionary for this test - The expected path - + - Test whether the constraint is satisfied by a given value + Provide the context information of the current test - The expected path - The actual path - True for success, false for failure - + - Write the constraint description to a MessageWriter + Constructs a TestContext using the provided context dictionary - The writer on which the description is displayed + A context dictionary - + - SubPathConstraint tests that the actual path is under the expected path + Get the current test context. This is created + as needed. The user may save the context for + use within a test, but it should not be used + outside the test for which it is created. - + - Initializes a new instance of the class. + Gets a TestAdapter representing the currently executing test in this context. - The expected path - + - Test whether the constraint is satisfied by a given value - - The expected path - The actual path - True for success, false for failure - - - - Write the constraint description to a MessageWriter + Gets a ResultAdapter representing the current result for the test + executing in this context. - The writer on which the description is displayed - + - SamePathOrUnderConstraint tests that one path is under another + Gets the directory containing the current test assembly. - + - Initializes a new instance of the class. + Gets the directory to be used for outputing files created + by this test run. - The expected path - + - Test whether the constraint is satisfied by a given value + TestAdapter adapts a Test for consumption by + the user test code. - The expected path - The actual path - True for success, false for failure - + - Write the constraint description to a MessageWriter + Constructs a TestAdapter for this context - The writer on which the description is displayed + The context dictionary - + - Predicate constraint wraps a Predicate in a constraint, - returning success if the predicate is true. + The name of the test. - + - Construct a PredicateConstraint from a predicate + The FullName of the test - + - Determines whether the predicate succeeds when applied - to the actual value. + The properties of the test. - + - Writes the description to a MessageWriter + ResultAdapter adapts a TestResult for consumption by + the user test code. - + - NotConstraint negates the effect of some other constraint + Construct a ResultAdapter for a context + The context holding the result - + - Initializes a new instance of the class. + The TestState of current test. This maps to the ResultState + used in nunit.core and is subject to change in the future. - The base constraint to be negated. - + - Test whether the constraint is satisfied by a given value + The TestStatus of current test. This enum will be used + in future versions of NUnit and so is to be preferred + to the TestState value. - The value to be tested - True for if the base constraint fails, false if it succeeds - + - Write the constraint description to a MessageWriter + Provides details about a test - The writer on which the description is displayed - + - Write the actual value for a failing constraint test to a MessageWriter. + Creates an instance of TestDetails - The writer on which the actual value is displayed + The fixture that the test is a member of, if available. + The method that implements the test, if available. + The full name of the test. + A string representing the type of test, e.g. "Test Case". + Indicates if the test represents a suite of tests. - + - AllItemsConstraint applies another constraint to each - item in a collection, succeeding if they all succeed. + The fixture that the test is a member of, if available. - + - Construct an AllItemsConstraint on top of an existing constraint + The method that implements the test, if available. - - + - Apply the item constraint to each item in the collection, - failing if any item fails. + The full name of the test. - - - + - Write a description of this constraint to a MessageWriter + A string representing the type of test, e.g. "Test Case". - - + - SomeItemsConstraint applies another constraint to each - item in a collection, succeeding if any of them succeeds. + Indicates if the test represents a suite of tests. - + - Construct a SomeItemsConstraint on top of an existing constraint + The ResultState enum indicates the result of running a test - - + - Apply the item constraint to each item in the collection, - succeeding if any item succeeds. + The result is inconclusive - - - + - Write a description of this constraint to a MessageWriter + The test was not runnable. - - + - NoItemConstraint applies another constraint to each - item in a collection, failing if any of them succeeds. + The test has been skipped. - + - Construct a NoItemConstraint on top of an existing constraint + The test has been ignored. - - + - Apply the item constraint to each item in the collection, - failing if any item fails. + The test succeeded - - - + - Write a description of this constraint to a MessageWriter + The test failed - - + - ExactCoutConstraint applies another constraint to each - item in a collection, succeeding only if a specified - number of items succeed. + The test encountered an unexpected exception - + - Construct an ExactCountConstraint on top of an existing constraint + The test was cancelled by the user - - - + - Apply the item constraint to each item in the collection, - succeeding only if the expected number of items pass. + The TestStatus enum indicates the result of running a test - - - + - Write a description of this constraint to a MessageWriter + The test was inconclusive - - + - PropertyExistsConstraint tests that a named property - exists on the object provided through Match. - - Originally, PropertyConstraint provided this feature - in addition to making optional tests on the vaue - of the property. The two constraints are now separate. + The test has skipped - + - Initializes a new instance of the class. + The test succeeded - The name of the property. - + - Test whether the property exists for a given object + The test failed - The object to be tested - True for success, false for failure - + - Write the constraint description to a MessageWriter + Helper class with static methods used to supply constraints + that operate on strings. - The writer on which the description is displayed - + - Write the actual value for a failing constraint test to a - MessageWriter. + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. - The writer on which the actual value is displayed - + - Returns the string representation of the constraint. + Returns a constraint that fails if the actual + value contains the substring supplied as an argument. - - + - PropertyConstraint extracts a named property and uses - its value as the actual value for a chained constraint. + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. - + - Initializes a new instance of the class. + Returns a constraint that fails if the actual + value starts with the substring supplied as an argument. - The name. - The constraint to apply to the property. - + - Test whether the constraint is satisfied by a given value + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. - The value to be tested - True for success, false for failure - + - Write the constraint description to a MessageWriter + Returns a constraint that fails if the actual + value ends with the substring supplied as an argument. - The writer on which the description is displayed - + - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. + Returns a constraint that succeeds if the actual + value matches the Regex pattern supplied as an argument. - The writer on which the actual value is displayed - + - Returns the string representation of the constraint. + Returns a constraint that fails if the actual + value matches the pattern supplied as an argument. - - + - RangeConstraint tests whethe two values are within a - specified range. + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. - + - Initializes a new instance of the class. + TextMessageWriter writes constraint descriptions and messages + in displayable form as a text stream. It tailors the display + of individual message components to form the standard message + format of NUnit assertion failure messages. - From. - To. - + - Test whether the constraint is satisfied by a given value + MessageWriter is the abstract base for classes that write + constraint descriptions and messages in some form. The + class has separate methods for writing various components + of a message, allowing implementations to tailor the + presentation as needed. - The value to be tested - True for success, false for failure - + - Write the constraint description to a MessageWriter + Construct a MessageWriter given a culture - The writer on which the description is displayed - + - ResolvableConstraintExpression is used to represent a compound - constraint being constructed at a point where the last operator - may either terminate the expression or may have additional - qualifying constraints added to it. - - It is used, for example, for a Property element or for - an Exception element, either of which may be optionally - followed by constraints that apply to the property or - exception. + Method to write single line message with optional args, usually + written to precede the general failure message. + The message to be written + Any arguments used in formatting the message - + - Create a new instance of ResolvableConstraintExpression + Method to write single line message with optional args, usually + written to precede the general failure message, at a givel + indentation level. + The indentation level of the message + The message to be written + Any arguments used in formatting the message - + - Create a new instance of ResolvableConstraintExpression, - passing in a pre-populated ConstraintBuilder. + Display Expected and Actual lines for a constraint. This + is called by MessageWriter's default implementation of + WriteMessageTo and provides the generic two-line display. + The constraint that failed - + - Resolve the current expression to a Constraint + Display Expected and Actual lines for given values. This + method may be called by constraints that need more control over + the display of actual and expected values than is provided + by the default implementation. + The expected value + The actual value causing the failure - + - This operator creates a constraint that is satisfied only if both - argument constraints are satisfied. + Display Expected and Actual lines for given values, including + a tolerance value on the Expected line. + The expected value + The actual value causing the failure + The tolerance within which the test was made - + - This operator creates a constraint that is satisfied only if both - argument constraints are satisfied. + Display the expected and actual string values on separate lines. + If the mismatch parameter is >=0, an additional line is displayed + line containing a caret that points to the mismatch point. + The expected string value + The actual string value + The point at which the strings don't match or -1 + If true, case is ignored in locating the point where the strings differ + If true, the strings should be clipped to fit the line - + - This operator creates a constraint that is satisfied only if both - argument constraints are satisfied. + Writes the text for a connector. + The connector. - + - This operator creates a constraint that is satisfied if either - of the argument constraints is satisfied. + Writes the text for a predicate. + The predicate. - + - This operator creates a constraint that is satisfied if either - of the argument constraints is satisfied. + Writes the text for an expected value. + The expected value. - + - This operator creates a constraint that is satisfied if either - of the argument constraints is satisfied. + Writes the text for a modifier + The modifier. - + - This operator creates a constraint that is satisfied if the - argument constraint is not satisfied. + Writes the text for an actual value. + The actual value. - + - Appends an And Operator to the expression + Writes the text for a generalized value. + The value. - + - Appends an Or operator to the expression. + Writes the text for a collection value, + starting at a particular point, to a max length + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write - + - ReusableConstraint wraps a resolved constraint so that it - may be saved and reused as needed. + Abstract method to get the max line length - + - Construct a ReusableConstraint + Prefix used for the expected value line of a message - The constraint or expression to be reused - + - Conversion operator from a normal constraint to a ReusableConstraint. + Prefix used for the actual value line of a message - The original constraint to be wrapped as a ReusableConstraint - - + - Returns the string representation of the constraint. + Length of a message prefix - A string representing the constraint - + - Resolves the ReusableConstraint by returning the constraint - that it originally wrapped. + Construct a TextMessageWriter - A resolved constraint - + - SameAsConstraint tests whether an object is identical to - the object passed to its constructor + Construct a TextMessageWriter, specifying a user message + and optional formatting arguments. + + - + - Initializes a new instance of the class. + Method to write single line message with optional args, usually + written to precede the general failure message, at a givel + indentation level. - The expected object. + The indentation level of the message + The message to be written + Any arguments used in formatting the message - + - Test whether the constraint is satisfied by a given value + Display Expected and Actual lines for a constraint. This + is called by MessageWriter's default implementation of + WriteMessageTo and provides the generic two-line display. - The value to be tested - True for success, false for failure + The constraint that failed - + - Write the constraint description to a MessageWriter + Display Expected and Actual lines for given values. This + method may be called by constraints that need more control over + the display of actual and expected values than is provided + by the default implementation. - The writer on which the description is displayed + The expected value + The actual value causing the failure - + - BinarySerializableConstraint tests whether - an object is serializable in binary format. + Display Expected and Actual lines for given values, including + a tolerance value on the expected line. + The expected value + The actual value causing the failure + The tolerance within which the test was made - + - Test whether the constraint is satisfied by a given value + Display the expected and actual string values on separate lines. + If the mismatch parameter is >=0, an additional line is displayed + line containing a caret that points to the mismatch point. - The value to be tested - True for success, false for failure + The expected string value + The actual string value + The point at which the strings don't match or -1 + If true, case is ignored in string comparisons + If true, clip the strings to fit the max line length - + - Write the constraint description to a MessageWriter + Writes the text for a connector. - The writer on which the description is displayed + The connector. - + - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. + Writes the text for a predicate. - The writer on which the actual value is displayed + The predicate. - + - Returns the string representation + Write the text for a modifier. + The modifier. - + - BinarySerializableConstraint tests whether - an object is serializable in binary format. + Writes the text for an expected value. + The expected value. - + - Test whether the constraint is satisfied by a given value + Writes the text for an actual value. - The value to be tested - True for success, false for failure + The actual value. - + - Write the constraint description to a MessageWriter + Writes the text for a generalized value. - The writer on which the description is displayed + The value. - + - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. + Writes the text for a collection value, + starting at a particular point, to a max length - The writer on which the actual value is displayed + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write - + - Returns the string representation of this constraint + Write the generic 'Expected' line for a constraint + The constraint that failed - + - StringConstraint is the abstract base for constraints - that operate on strings. It supports the IgnoreCase - modifier for string operations. + Write the generic 'Expected' line for a given value + The expected value - + - The expected value + Write the generic 'Expected' line for a given value + and tolerance. + The expected value + The tolerance within which the test was made - + - Indicates whether tests should be case-insensitive + Write the generic 'Actual' line for a constraint + The constraint for which the actual value is to be written - + - Constructs a StringConstraint given an expected value + Write the generic 'Actual' line for a given value - The expected value + The actual value causing a failure - + - Modify the constraint to ignore case in matching. + Gets or sets the maximum line length for this writer - + - EmptyStringConstraint tests whether a string is empty. + Helper class with properties and methods that supply + constraints that operate on exceptions. - + - Test whether the constraint is satisfied by a given value + Creates a constraint specifying the exact type of exception expected - The value to be tested - True for success, false for failure - + - Write the constraint description to a MessageWriter + Creates a constraint specifying the exact type of exception expected - The writer on which the description is displayed - + - NullEmptyStringConstraint tests whether a string is either null or empty. + Creates a constraint specifying the type of exception expected - + - Constructs a new NullOrEmptyStringConstraint + Creates a constraint specifying the type of exception expected - + - Test whether the constraint is satisfied by a given value + Creates a constraint specifying an expected exception - The value to be tested - True for success, false for failure - + - Write the constraint description to a MessageWriter + Creates a constraint specifying an exception with a given InnerException - The writer on which the description is displayed - + - SubstringConstraint can test whether a string contains - the expected substring. + Creates a constraint specifying an expected TargetInvocationException - + - Initializes a new instance of the class. + Creates a constraint specifying an expected TargetInvocationException - The expected. - + - Test whether the constraint is satisfied by a given value + Creates a constraint specifying an expected TargetInvocationException - The value to be tested - True for success, false for failure - + - Write the constraint description to a MessageWriter + Creates a constraint specifying that no exception is thrown - The writer on which the description is displayed - + - StartsWithConstraint can test whether a string starts - with an expected substring. + Attribute used to apply a category to a test - + - Initializes a new instance of the class. + The name of the category - The expected string - + - Test whether the constraint is matched by the actual value. - This is a template method, which calls the IsMatch method - of the derived class. + Construct attribute for a given category based on + a name. The name may not contain the characters ',', + '+', '-' or '!'. However, this is not checked in the + constructor since it would cause an error to arise at + as the test was loaded without giving a clear indication + of where the problem is located. The error is handled + in NUnitFramework.cs by marking the test as not + runnable. - - + The name of the category - + - Write the constraint description to a MessageWriter + Protected constructor uses the Type name as the name + of the category. - The writer on which the description is displayed - + - EndsWithConstraint can test whether a string ends - with an expected substring. + The name of the category - + - Initializes a new instance of the class. + Used to mark a field for use as a datapoint when executing a theory + within the same fixture that requires an argument of the field's Type. - The expected string - + - Test whether the constraint is matched by the actual value. - This is a template method, which calls the IsMatch method - of the derived class. + Used to mark an array as containing a set of datapoints to be used + executing a theory within the same fixture that requires an argument + of the Type of the array elements. - - - + - Write the constraint description to a MessageWriter + Attribute used to provide descriptive text about a + test case or fixture. - The writer on which the description is displayed - + - RegexConstraint can test whether a string matches - the pattern provided. + Construct the attribute + Text describing the test - + - Initializes a new instance of the class. + Gets the test description - The pattern. - + - Test whether the constraint is satisfied by a given value + Enumeration indicating how the expected message parameter is to be used - The value to be tested - True for success, false for failure - + + Expect an exact match + + + Expect a message containing the parameter string + + + Match the regular expression provided as a parameter + + + Expect a message that starts with the parameter string + + - Write the constraint description to a MessageWriter + ExpectedExceptionAttribute - The writer on which the description is displayed + - + - ThrowsConstraint is used to test the exception thrown by - a delegate by applying a constraint to it. + Constructor for a non-specific exception - + - Initializes a new instance of the class, - using a constraint to be applied to the exception. + Constructor for a given type of exception - A constraint to apply to the caught exception. + The type of the expected exception - + - Executes the code of the delegate and captures any exception. - If a non-null base constraint was provided, it applies that - constraint to the exception. + Constructor for a given exception name - A delegate representing the code to be tested - True if an exception is thrown and the constraint succeeds, otherwise false + The full name of the expected exception - + - Converts an ActualValueDelegate to a TestDelegate - before calling the primary overload. + Gets or sets the expected exception type - - - + - Write the constraint description to a MessageWriter + Gets or sets the full Type name of the expected exception - The writer on which the description is displayed - + - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. + Gets or sets the expected message text - The writer on which the actual value is displayed - + - Returns the string representation of this constraint + Gets or sets the user message displayed in case of failure - + - Get the actual exception thrown - used by Assert.Throws. + Gets or sets the type of match to be performed on the expected message - + - ThrowsNothingConstraint tests that a delegate does not - throw an exception. + Gets the name of a method to be used as an exception handler - + - Test whether the constraint is satisfied by a given value + ExplicitAttribute marks a test or test fixture so that it will + only be run if explicitly executed from the gui or command line + or if it is included by use of a filter. The test will not be + run simply because an enclosing suite is run. - The value to be tested - True if no exception is thrown, otherwise false - + - Converts an ActualValueDelegate to a TestDelegate - before calling the primary overload. + Default constructor - - - + - Write the constraint description to a MessageWriter + Constructor with a reason - The writer on which the description is displayed + The reason test is marked explicit - + - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. + The reason test is marked explicit - The writer on which the actual value is displayed - + - Modes in which the tolerance value for a comparison can - be interpreted. + Attribute used to mark a test that is to be ignored. + Ignored tests result in a warning message when the + tests are run. - + - The tolerance was created with a value, without specifying - how the value would be used. This is used to prevent setting - the mode more than once and is generally changed to Linear - upon execution of the test. + Constructs the attribute without giving a reason + for ignoring the test. - + - The tolerance is used as a numeric range within which - two compared values are considered to be equal. + Constructs the attribute giving a reason for ignoring the test + The reason for ignoring the test - + - Interprets the tolerance as the percentage by which - the two compared values my deviate from each other. + The reason for ignoring a test - + - Compares two values based in their distance in - representable numbers. + Abstract base for Attributes that are used to include tests + in the test run based on environmental settings. - + - The Tolerance class generalizes the notion of a tolerance - within which an equality test succeeds. Normally, it is - used with numeric types, but it can be used with any - type that supports taking a difference between two - objects and comparing that difference to a value. + Constructor with no included items specified, for use + with named property syntax. - + - Constructs a linear tolerance of a specdified amount + Constructor taking one or more included items + Comma-delimited list of included items - + - Constructs a tolerance given an amount and ToleranceMode + Name of the item that is needed in order for + a test to run. Multiple itemss may be given, + separated by a comma. - + - Tests that the current Tolerance is linear with a - numeric value, throwing an exception if it is not. + Name of the item to be excluded. Multiple items + may be given, separated by a comma. - + - Returns an empty Tolerance object, equivalent to - specifying no tolerance. In most cases, it results - in an exact match but for floats and doubles a - default tolerance may be used. + The reason for including or excluding the test - + - Returns a zero Tolerance object, equivalent to - specifying an exact match. + PlatformAttribute is used to mark a test fixture or an + individual method as applying to a particular platform only. - + - Gets the ToleranceMode for the current Tolerance + Constructor with no platforms specified, for use + with named property syntax. - + - Gets the value of the current Tolerance instance. + Constructor taking one or more platforms + Comma-deliminted list of platforms - + - Returns a new tolerance, using the current amount as a percentage. + CultureAttribute is used to mark a test fixture or an + individual method as applying to a particular Culture only. - + - Returns a new tolerance, using the current amount in Ulps. + Constructor with no cultures specified, for use + with named property syntax. - + - Returns a new tolerance with a TimeSpan as the amount, using - the current amount as a number of days. + Constructor taking one or more cultures + Comma-deliminted list of cultures - + - Returns a new tolerance with a TimeSpan as the amount, using - the current amount as a number of hours. + Marks a test to use a combinatorial join of any argument data + provided. NUnit will create a test case for every combination of + the arguments provided. This can result in a large number of test + cases and so should be used judiciously. This is the default join + type, so the attribute need not be used except as documentation. - + - Returns a new tolerance with a TimeSpan as the amount, using - the current amount as a number of minutes. + PropertyAttribute is used to attach information to a test as a name/value pair.. - + - Returns a new tolerance with a TimeSpan as the amount, using - the current amount as a number of seconds. + Construct a PropertyAttribute with a name and string value + The name of the property + The property value - + - Returns a new tolerance with a TimeSpan as the amount, using - the current amount as a number of milliseconds. + Construct a PropertyAttribute with a name and int value + The name of the property + The property value - + - Returns a new tolerance with a TimeSpan as the amount, using - the current amount as a number of clock ticks. + Construct a PropertyAttribute with a name and double value + The name of the property + The property value - + - Returns true if the current tolerance is empty. + Constructor for derived classes that set the + property dictionary directly. - + - TypeConstraint is the abstract base for constraints - that take a Type as their expected value. + Constructor for use by derived classes that use the + name of the type as the property name. Derived classes + must ensure that the Type of the property value is + a standard type supported by the BCL. Any custom + types will cause a serialization Exception when + in the client. - + - The expected Type used by the constraint + Gets the property dictionary for this attribute - + - Construct a TypeConstraint for a given Type + Default constructor - - + - Write the actual value for a failing constraint test to a - MessageWriter. TypeConstraints override this method to write - the name of the type. + Marks a test to use pairwise join of any argument data provided. + NUnit will attempt too excercise every pair of argument values at + least once, using as small a number of test cases as it can. With + only two arguments, this is the same as a combinatorial join. - The writer on which the actual value is displayed - + - ExactTypeConstraint is used to test that an object - is of the exact type provided in the constructor + Default constructor - + - Construct an ExactTypeConstraint for a given Type + Marks a test to use a sequential join of any argument data + provided. NUnit will use arguements for each parameter in + sequence, generating test cases up to the largest number + of argument values provided and using null for any arguments + for which it runs out of values. Normally, this should be + used with the same number of arguments for each parameter. - The expected Type. - + - Test that an object is of the exact type specified + Default constructor - The actual value. - True if the tested object is of the exact type provided, otherwise false. - + - Write the description of this constraint to a MessageWriter + Summary description for MaxTimeAttribute. - The MessageWriter to use - + - ExceptionTypeConstraint is a special version of ExactTypeConstraint - used to provided detailed info about the exception thrown in - an error message. + Construct a MaxTimeAttribute, given a time in milliseconds. + The maximum elapsed time in milliseconds - + - Constructs an ExceptionTypeConstraint + RandomAttribute is used to supply a set of random values + to a single parameter of a parameterized test. - + - Write the actual value for a failing constraint test to a - MessageWriter. Overriden to write additional information - in the case of an Exception. + ValuesAttribute is used to provide literal arguments for + an individual parameter of a test. - The MessageWriter to use - + - InstanceOfTypeConstraint is used to test that an object - is of the same type provided or derived from it. + Abstract base class for attributes that apply to parameters + and supply data for the parameter. - + - Construct an InstanceOfTypeConstraint for the type provided + Gets the data to be provided to the specified parameter - The expected Type - + - Test whether an object is of the specified type or a derived type + The collection of data to be returned. Must + be set by any derived attribute classes. + We use an object[] so that the individual + elements may have their type changed in GetData + if necessary. - The object to be tested - True if the object is of the provided type or derives from it, otherwise false. - + - Write a description of this constraint to a MessageWriter + Construct with one argument - The MessageWriter to use + - + - AssignableFromConstraint is used to test that an object - can be assigned from a given Type. + Construct with two arguments + + - + - Construct an AssignableFromConstraint for the type provided + Construct with three arguments - + + + - + - Test whether an object can be assigned from the specified type + Construct with an array of arguments - The object to be tested - True if the object can be assigned a value of the expected Type, otherwise false. + - + - Write a description of this constraint to a MessageWriter + Get the collection of values to be used as arguments - The MessageWriter to use - + - AssignableToConstraint is used to test that an object - can be assigned to a given Type. + Construct a set of doubles from 0.0 to 1.0, + specifying only the count. + - + - Construct an AssignableToConstraint for the type provided + Construct a set of doubles from min to max - + + + - + - Test whether an object can be assigned to the specified type + Construct a set of ints from min to max - The object to be tested - True if the object can be assigned a value of the expected Type, otherwise false. + + + - + - Write a description of this constraint to a MessageWriter + Get the collection of values to be used as arguments - The MessageWriter to use - + - Thrown when an assertion failed. + RangeAttribute is used to supply a range of values to an + individual parameter of a parameterized test. - - - - The error message that explains - the reason for the exception - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - + - Serialization Constructor + Construct a range of ints using default step of 1 + + - + - Thrown when an assertion failed. + Construct a range of ints specifying the step size + + + - - - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - + - Serialization Constructor + Construct a range of longs + + + - + - Thrown when a test executes inconclusively. + Construct a range of doubles - - - - The error message that explains - the reason for the exception - - - The error message that explains - the reason for the exception - The exception that caused the - current exception + + + - + - Serialization Constructor + Construct a range of floats + + + - + - Thrown when an assertion failed. + RepeatAttribute may be applied to test case in order + to run it multiple times. - - - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - + - Serialization Constructor + Construct a RepeatAttribute + The number of times to run the test - + - + RequiredAddinAttribute may be used to indicate the names of any addins + that must be present in order to run some or all of the tests in an + assembly. If the addin is not loaded, the entire assembly is marked + as NotRunnable. - - + - Compares two objects of a given Type for equality within a tolerance + Initializes a new instance of the class. - The first object to compare - The second object to compare - The tolerance to use in the comparison - + The required addin. - + - The different targets a test action attribute can be applied to + Gets the name of required addin. + The required addin name. - + - Default target, which is determined by where the action attribute is attached + Summary description for SetCultureAttribute. - + - Target a individual test case + Construct given the name of a culture + - + - Target a suite of test cases + Summary description for SetUICultureAttribute. - + - Delegate used by tests that execute code and - capture any thrown exception. + Construct given the name of a culture + - + - The Assert class contains a collection of static methods that - implement the most common assertions used in NUnit. + SetUpAttribute is used in a TestFixture to identify a method + that is called immediately before each test is run. It is + also used in a SetUpFixture to identify the method that is + called once, before any of the subordinate tests are run. - + - We don't actually want any instances of this object, but some people - like to inherit from it to add other static methods. Hence, the - protected constructor disallows any instances of this object. + Attribute used to mark a class that contains one-time SetUp + and/or TearDown methods that apply to all the tests in a + namespace or an assembly. - + - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. + Attribute used to mark a static (shared in VB) property + that returns a list of tests. - - - + - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. + Attribute used in a TestFixture to identify a method that is + called immediately after each test is run. It is also used + in a SetUpFixture to identify the method that is called once, + after all subordinate tests have run. In either case, the method + is guaranteed to be called, even if an exception is thrown. - - - + - Helper for Assert.AreEqual(double expected, double actual, ...) - allowing code generation to work consistently. + Provide actions to execute before and after tests. - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message - + - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. + When implemented by an attribute, this interface implemented to provide actions to execute before and after tests. - The message to initialize the with. - Arguments to be used in formatting the message - + - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. + Executed before each test is run - The message to initialize the with. + Provides details about the test that is going to be run. - + - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. + Executed after each test is run + Provides details about the test that has just been run. - + - Throws an with the message and arguments - that are passed in. This is used by the other Assert functions. + Provides the target for the action attribute - The message to initialize the with. - Arguments to be used in formatting the message + The target for the action attribute - + - Throws an with the message that is - passed in. This is used by the other Assert functions. + Adding this attribute to a method within a + class makes the method callable from the NUnit test runner. There is a property + called Description which is optional which you can provide a more detailed test + description. This class cannot be inherited. - The message to initialize the with. + + + [TestFixture] + public class Fixture + { + [Test] + public void MethodToTest() + {} + + [Test(Description = "more detailed description")] + publc void TestDescriptionMethod() + {} + } + + - + - Throws an . - This is used by the other Assert functions. + Descriptive text for this test - + - Throws an with the message and arguments - that are passed in. This causes the test to be reported as ignored. + TestCaseAttribute is used to mark parameterized test cases + and provide them with their arguments. - The message to initialize the with. - Arguments to be used in formatting the message - + - Throws an with the message that is - passed in. This causes the test to be reported as ignored. + Construct a TestCaseAttribute with a list of arguments. + This constructor is not CLS-Compliant - The message to initialize the with. + - + - Throws an . - This causes the test to be reported as ignored. + Construct a TestCaseAttribute with a single argument + - + - Throws an with the message and arguments - that are passed in. This causes the test to be reported as inconclusive. + Construct a TestCaseAttribute with a two arguments - The message to initialize the with. - Arguments to be used in formatting the message + + - + - Throws an with the message that is - passed in. This causes the test to be reported as inconclusive. + Construct a TestCaseAttribute with a three arguments - The message to initialize the with. + + + - + - Throws an . - This causes the test to be reported as Inconclusive. + Gets the list of arguments to a test case - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + Gets or sets the expected result. Use + ExpectedResult by preference. - A Constraint to be applied - The actual value to test + The result. - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + Gets or sets the expected result. - A Constraint to be applied - The actual value to test - The message that will be displayed on failure + The result. - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + Gets a flag indicating whether an expected + result has been set. - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + Gets a list of categories associated with this test; - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + Gets or sets the category associated with this test. + May be a single category or a comma-separated list. - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - The message that will be displayed on failure - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + Gets or sets the expected exception. - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message + The expected exception. - + - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + Gets or sets the name the expected exception. - A Constraint to be applied - The actual value to test + The expected name of the exception. - + - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + Gets or sets the expected message of the expected exception - A Constraint to be applied - The actual value to test - The message that will be displayed on failure + The expected message of the exception. - + - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + Gets or sets the type of match to be performed on the expected message - A Constraint to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - + - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message + Gets or sets the description. + + The description. - + - Asserts that a condition is true. If the condition is false the method throws - an . + Gets or sets the name of the test. - The evaluated condition - The message to display if the condition is false + The name of the test. - + - Asserts that a condition is true. If the condition is false the method throws - an . + Gets or sets the ignored status of the test - The evaluated condition - + - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. + Gets or sets the ignored status of the test - A TestDelegate to be executed - A ThrowsConstraint used in the test - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - Used as a synonym for That in rare cases where a private setter - causes a Visual Basic compilation error. + Gets or sets the explicit status of the test - A Constraint to be applied - The actual value to test - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - Used as a synonym for That in rare cases where a private setter - causes a Visual Basic compilation error. + Gets or sets the reason for not running the test - A Constraint to be applied - The actual value to test - The message that will be displayed on failure - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - Used as a synonym for That in rare cases where a private setter - causes a Visual Basic compilation error. + Gets or sets the reason for not running the test. + Set has the side effect of marking the test as ignored. - - This method is provided for use by VB developers needing to test - the value of properties with private setters. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message + The ignore reason. - + - Verifies that a delegate throws a particular exception when called. + FactoryAttribute indicates the source to be used to + provide test cases for a test method. - A constraint to be satisfied by the exception - A TestSnippet delegate - The message that will be displayed on failure - Arguments to be used in formatting the message - + - Verifies that a delegate throws a particular exception when called. + Construct with the name of the data source, which must + be a property, field or method of the test class itself. - A constraint to be satisfied by the exception - A TestSnippet delegate - The message that will be displayed on failure + An array of the names of the factories that will provide data - + - Verifies that a delegate throws a particular exception when called. + Construct with a Type, which must implement IEnumerable - A constraint to be satisfied by the exception - A TestSnippet delegate + The Type that will provide data - + - Verifies that a delegate throws a particular exception when called. + Construct with a Type and name. + that don't support params arrays. - The exception Type expected - A TestSnippet delegate - The message that will be displayed on failure - Arguments to be used in formatting the message + The Type that will provide data + The name of the method, property or field that will provide data - + - Verifies that a delegate throws a particular exception when called. + The name of a the method, property or fiend to be used as a source - The exception Type expected - A TestSnippet delegate - The message that will be displayed on failure - + - Verifies that a delegate throws a particular exception when called. + A Type to be used as a source - The exception Type expected - A TestSnippet delegate - + - Verifies that a delegate throws a particular exception when called. + Gets or sets the category associated with this test. + May be a single category or a comma-separated list. - Type of the expected exception - A TestSnippet delegate - The message that will be displayed on failure - Arguments to be used in formatting the message - + + + [TestFixture] + public class ExampleClass + {} + + + - Verifies that a delegate throws a particular exception when called. + Default constructor - Type of the expected exception - A TestSnippet delegate - The message that will be displayed on failure - + - Verifies that a delegate throws a particular exception when called. + Construct with a object[] representing a set of arguments. + In .NET 2.0, the arguments may later be separated into + type arguments and constructor arguments. - Type of the expected exception - A TestSnippet delegate + - + - Verifies that a delegate throws an exception when called - and returns it. + Descriptive text for this fixture - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - + - Verifies that a delegate throws an exception when called - and returns it. + Gets and sets the category for this fixture. + May be a comma-separated list of categories. - A TestDelegate - The message that will be displayed on failure - + - Verifies that a delegate throws an exception when called - and returns it. + Gets a list of categories for this fixture - A TestDelegate - + - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. + The arguments originally provided to the attribute - The expected Exception Type - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - + - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. + Gets or sets a value indicating whether this should be ignored. - The expected Exception Type - A TestDelegate - The message that will be displayed on failure + true if ignore; otherwise, false. - + - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. + Gets or sets the ignore reason. May set Ignored as a side effect. - The expected Exception Type - A TestDelegate + The ignore reason. - + - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. + Get or set the type arguments. If not set + explicitly, any leading arguments that are + Types are taken as type arguments. - The expected Exception Type - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - + - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. + Attribute used to identify a method that is + called before any tests in a fixture are run. - The expected Exception Type - A TestDelegate - The message that will be displayed on failure - + - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. + Attribute used to identify a method that is called after + all the tests in a fixture have run. The method is + guaranteed to be called, even if an exception is thrown. - The expected Exception Type - A TestDelegate - + - Verifies that a delegate does not throw an exception + Adding this attribute to a method within a + class makes the method callable from the NUnit test runner. There is a property + called Description which is optional which you can provide a more detailed test + description. This class cannot be inherited. - A TestSnippet delegate - The message that will be displayed on failure - Arguments to be used in formatting the message + + + [TestFixture] + public class Fixture + { + [Test] + public void MethodToTest() + {} + + [Test(Description = "more detailed description")] + publc void TestDescriptionMethod() + {} + } + + - + - Verifies that a delegate does not throw an exception. + Used on a method, marks the test with a timeout value in milliseconds. + The test will be run in a separate thread and is cancelled if the timeout + is exceeded. Used on a method or assembly, sets the default timeout + for all contained test methods. - A TestSnippet delegate - The message that will be displayed on failure - + - Verifies that a delegate does not throw an exception. + Construct a TimeoutAttribute given a time in milliseconds - A TestSnippet delegate + The timeout value in milliseconds - + - Asserts that a condition is true. If the condition is false the method throws - an . + Marks a test that must run in the STA, causing it + to run in a separate thread if necessary. + + On methods, you may also use STAThreadAttribute + to serve the same purpose. - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - + - Asserts that a condition is true. If the condition is false the method throws - an . + Construct a RequiresSTAAttribute - The evaluated condition - The message to display in case of failure - + - Asserts that a condition is true. If the condition is false the method throws - an . + Marks a test that must run in the MTA, causing it + to run in a separate thread if necessary. + + On methods, you may also use MTAThreadAttribute + to serve the same purpose. - The evaluated condition - + - Asserts that a condition is true. If the condition is false the method throws - an . + Construct a RequiresMTAAttribute - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - + - Asserts that a condition is true. If the condition is false the method throws - an . + Marks a test that must run on a separate thread. - The evaluated condition - The message to display in case of failure - + - Asserts that a condition is true. If the condition is false the method throws - an . + Construct a RequiresThreadAttribute - The evaluated condition - + - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message + Construct a RequiresThreadAttribute, specifying the apartment + - + - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure + ValueSourceAttribute indicates the source to be used to + provide data for one parameter of a test method. + - + - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition + Construct with the name of the factory - for use with languages + that don't support params arrays. + + The name of the data source to be used - + - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message + Construct with a Type and name - for use with languages + that don't support params arrays. + + The Type that will provide data + The name of the method, property or field that will provide data - + - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure + The name of a the method, property or fiend to be used as a source + - + - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition + A Type to be used as a source + - + - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. + AllItemsConstraint applies another constraint to each + item in a collection, succeeding if they all succeed. - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. + Abstract base class used for prefixes - The object that is to be tested - The message to display in case of failure - + - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. + The Constraint class is the base of all built-in constraints + within NUnit. It provides the operator overloads used to combine + constraints. - The object that is to be tested - + - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. + The IConstraintExpression interface is implemented by all + complete and resolvable constraints and expressions. - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. + Return the top-level constraint for this expression - The object that is to be tested - The message to display in case of failure + - + - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. + Static UnsetObject used to detect derived constraints + failing to set the actual value. - The object that is to be tested - + - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. + The actual value being tested against a constraint - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. + The display name of this Constraint for use by ToString() - The object that is to be tested - The message to display in case of failure - + - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. + Argument fields used by ToString(); - The object that is to be tested - + - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. + The builder holding this constraint - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. + Construct a constraint with no arguments - The object that is to be tested - The message to display in case of failure - + - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. + Construct a constraint with one argument - The object that is to be tested - + - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. + Construct a constraint with two arguments - The value that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. + Sets the ConstraintBuilder holding this constraint - The value that is to be tested - The message to display in case of failure - + - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. + Write the failure message to the MessageWriter provided + as an argument. The default implementation simply passes + the constraint and the actual value to the writer, which + then displays the constraint description and the value. + + Constraints that need to provide additional details, + such as where the error occured can override this. - The value that is to be tested + The MessageWriter on which to display the message - + - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. + Test whether the constraint is satisfied by a given value - The value that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message + The value to be tested + True for success, false for failure - + - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. + Test whether the constraint is satisfied by an + ActualValueDelegate that returns the value to be tested. + The default implementation simply evaluates the delegate + but derived classes may override it to provide for delayed + processing. - The value that is to be tested - The message to display in case of failure + An + True for success, false for failure - + - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. + Test whether the constraint is satisfied by a given reference. + The default implementation simply dereferences the value but + derived classes may override it to provide for delayed processing. - The value that is to be tested + A reference to the value to be tested + True for success, false for failure - + - Assert that a string is empty - that is equal to string.Empty + Write the constraint description to a MessageWriter - The string to be tested - The message to display in case of failure - Array of objects to be used in formatting the message + The writer on which the description is displayed - + - Assert that a string is empty - that is equal to string.Empty + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. - The string to be tested - The message to display in case of failure + The writer on which the actual value is displayed - + - Assert that a string is empty - that is equal to string.Empty + Default override of ToString returns the constraint DisplayName + followed by any arguments within angle brackets. - The string to be tested + - + - Assert that an array, list or other collection is empty + Returns the string representation of this constraint - An array, list or other collection implementing ICollection - The message to display in case of failure - Array of objects to be used in formatting the message - + - Assert that an array, list or other collection is empty + This operator creates a constraint that is satisfied only if both + argument constraints are satisfied. - An array, list or other collection implementing ICollection - The message to display in case of failure - + - Assert that an array, list or other collection is empty + This operator creates a constraint that is satisfied if either + of the argument constraints is satisfied. - An array, list or other collection implementing ICollection - + - Assert that a string is not empty - that is not equal to string.Empty + This operator creates a constraint that is satisfied if the + argument constraint is not satisfied. - The string to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - + - Assert that a string is not empty - that is not equal to string.Empty + Returns a DelayedConstraint with the specified delay time. - The string to be tested - The message to display in case of failure + The delay in milliseconds. + - + - Assert that a string is not empty - that is not equal to string.Empty + Returns a DelayedConstraint with the specified delay time + and polling interval. - The string to be tested + The delay in milliseconds. + The interval at which to test the constraint. + - + - Assert that an array, list or other collection is not empty + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. - An array, list or other collection implementing ICollection - The message to display in case of failure - Array of objects to be used in formatting the message - + - Assert that an array, list or other collection is not empty + Returns a ConstraintExpression by appending And + to the current constraint. - An array, list or other collection implementing ICollection - The message to display in case of failure - + - Assert that an array, list or other collection is not empty + Returns a ConstraintExpression by appending And + to the current constraint. - An array, list or other collection implementing ICollection - + - Assert that a string is either null or equal to string.Empty + Returns a ConstraintExpression by appending Or + to the current constraint. - The string to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - + - Assert that a string is either null or equal to string.Empty + Class used to detect any derived constraints + that fail to set the actual value in their + Matches override. - The string to be tested - The message to display in case of failure - + - Assert that a string is either null or equal to string.Empty + The base constraint - The string to be tested - + - Assert that a string is not null or empty + Construct given a base constraint - The string to be tested - The message to display in case of failure - Array of objects to be used in formatting the message + - + - Assert that a string is not null or empty + Construct an AllItemsConstraint on top of an existing constraint - The string to be tested - The message to display in case of failure + - + - Assert that a string is not null or empty + Apply the item constraint to each item in the collection, + failing if any item fails. - The string to be tested + + - + - Asserts that an object may be assigned a value of a given Type. + Write a description of this constraint to a MessageWriter - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message + - + - Asserts that an object may be assigned a value of a given Type. + AndConstraint succeeds only if both members succeed. - The expected Type. - The object under examination - The message to display in case of failure - + - Asserts that an object may be assigned a value of a given Type. + BinaryConstraint is the abstract base of all constraints + that combine two other constraints in some fashion. - The expected Type. - The object under examination - + - Asserts that an object may be assigned a value of a given Type. + The first constraint being combined - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - + - Asserts that an object may be assigned a value of a given Type. + The second constraint being combined - The expected Type. - The object under examination - The message to display in case of failure - + - Asserts that an object may be assigned a value of a given Type. + Construct a BinaryConstraint from two other constraints - The expected Type. - The object under examination + The first constraint + The second constraint - + - Asserts that an object may not be assigned a value of a given Type. + Create an AndConstraint from two other constraints - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message + The first constraint + The second constraint - + - Asserts that an object may not be assigned a value of a given Type. + Apply both member constraints to an actual value, succeeding + succeeding only if both of them succeed. - The expected Type. - The object under examination - The message to display in case of failure + The actual value + True if the constraints both succeeded - + - Asserts that an object may not be assigned a value of a given Type. + Write a description for this contraint to a MessageWriter - The expected Type. - The object under examination + The MessageWriter to receive the description - + - Asserts that an object may not be assigned a value of a given Type. + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message + The writer on which the actual value is displayed - + - Asserts that an object may not be assigned a value of a given Type. + AssignableFromConstraint is used to test that an object + can be assigned from a given Type. - The expected Type. - The object under examination - The message to display in case of failure - + - Asserts that an object may not be assigned a value of a given Type. + TypeConstraint is the abstract base for constraints + that take a Type as their expected value. - The expected Type. - The object under examination - + - Asserts that an object is an instance of a given type. + The expected Type used by the constraint - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - + - Asserts that an object is an instance of a given type. + Construct a TypeConstraint for a given Type - The expected Type - The object being examined - The message to display in case of failure + - + - Asserts that an object is an instance of a given type. + Write the actual value for a failing constraint test to a + MessageWriter. TypeConstraints override this method to write + the name of the type. - The expected Type - The object being examined + The writer on which the actual value is displayed - + - Asserts that an object is an instance of a given type. + Construct an AssignableFromConstraint for the type provided - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message + - + - Asserts that an object is an instance of a given type. + Test whether an object can be assigned from the specified type - The expected Type - The object being examined - The message to display in case of failure + The object to be tested + True if the object can be assigned a value of the expected Type, otherwise false. - + - Asserts that an object is an instance of a given type. + Write a description of this constraint to a MessageWriter - The expected Type - The object being examined + The MessageWriter to use - + - Asserts that an object is an instance of a given type. + AssignableToConstraint is used to test that an object + can be assigned to a given Type. - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - + - Asserts that an object is an instance of a given type. + Construct an AssignableToConstraint for the type provided - The expected Type - The object being examined - The message to display in case of failure + - + - Asserts that an object is an instance of a given type. + Test whether an object can be assigned to the specified type - The expected Type - The object being examined + The object to be tested + True if the object can be assigned a value of the expected Type, otherwise false. - + - Asserts that an object is not an instance of a given type. + Write a description of this constraint to a MessageWriter - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message + The MessageWriter to use - + - Asserts that an object is not an instance of a given type. + AttributeConstraint tests that a specified attribute is present + on a Type or other provider and that the value of the attribute + satisfies some other constraint. - The expected Type - The object being examined - The message to display in case of failure - + - Asserts that an object is not an instance of a given type. + Constructs an AttributeConstraint for a specified attriute + Type and base constraint. - The expected Type - The object being examined + + - + - Asserts that an object is not an instance of a given type. + Determines whether the Type or other provider has the + expected attribute and if its value matches the + additional constraint specified. - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - + - Asserts that an object is not an instance of a given type. + Writes a description of the attribute to the specified writer. - The expected Type - The object being examined - The message to display in case of failure - + - Asserts that an object is not an instance of a given type. + Writes the actual value supplied to the specified writer. - The expected Type - The object being examined - + - Asserts that an object is not an instance of a given type. + Returns a string representation of the constraint. - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - + - Asserts that an object is not an instance of a given type. + AttributeExistsConstraint tests for the presence of a + specified attribute on a Type. - The expected Type - The object being examined - The message to display in case of failure - + - Asserts that an object is not an instance of a given type. + Constructs an AttributeExistsConstraint for a specific attribute Type - The expected Type - The object being examined + - + - Verifies that two values are equal. If they are not, then an - is thrown. + Tests whether the object provides the expected attribute. - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message + A Type, MethodInfo, or other ICustomAttributeProvider + True if the expected attribute is present, otherwise false - + - Verifies that two values are equal. If they are not, then an - is thrown. + Writes the description of the constraint to the specified writer - The expected value - The actual value - The message to display in case of failure - + - Verifies that two values are equal. If they are not, then an - is thrown. + BasicConstraint is the abstract base for constraints that + perform a simple comparison to a constant value. - The expected value - The actual value - + - Verifies that two values are equal. If they are not, then an - is thrown. + Initializes a new instance of the class. - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message + The expected. + The description. - + - Verifies that two values are equal. If they are not, then an - is thrown. + Test whether the constraint is satisfied by a given value - The expected value - The actual value - The message to display in case of failure + The value to be tested + True for success, false for failure - + - Verifies that two values are equal. If they are not, then an - is thrown. + Write the constraint description to a MessageWriter - The expected value - The actual value + The writer on which the description is displayed - + - Verifies that two values are equal. If they are not, then an - is thrown. + BinarySerializableConstraint tests whether + an object is serializable in binary format. - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that two values are equal. If they are not, then an - is thrown. + Test whether the constraint is satisfied by a given value - The expected value - The actual value - The message to display in case of failure + The value to be tested + True for success, false for failure - + - Verifies that two values are equal. If they are not, then an - is thrown. + Write the constraint description to a MessageWriter - The expected value - The actual value + The writer on which the description is displayed - + - Verifies that two values are equal. If they are not, then an - is thrown. + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message + The writer on which the actual value is displayed - + - Verifies that two values are equal. If they are not, then an - is thrown. + Returns the string representation - The expected value - The actual value - The message to display in case of failure - + - Verifies that two values are equal. If they are not, then an - is thrown. + CollectionConstraint is the abstract base class for + constraints that operate on collections. - The expected value - The actual value - + - Verifies that two values are equal. If they are not, then an - is thrown. + Construct an empty CollectionConstraint - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that two values are equal. If they are not, then an - is thrown. + Construct a CollectionConstraint - The expected value - The actual value - The message to display in case of failure + - + - Verifies that two values are equal. If they are not, then an - is thrown. + Determines whether the specified enumerable is empty. - The expected value - The actual value + The enumerable. + + true if the specified enumerable is empty; otherwise, false. + - + - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. + Test whether the constraint is satisfied by a given value - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message + The value to be tested + True for success, false for failure - + - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. + Protected method to be implemented by derived classes - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure + + - + - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. + CollectionContainsConstraint is used to test whether a collection + contains an expected object as a member. - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - + - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. + CollectionItemsEqualConstraint is the abstract base class for all + collection constraints that apply some notion of item equality + as a part of their operation. - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. + Construct an empty CollectionConstraint - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - + - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. + Construct a CollectionConstraint - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual + - + - Verifies that two objects are equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are not equal an is thrown. + Flag the constraint to use the supplied EqualityAdapter. + NOTE: For internal use only. - The value that is expected - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message + The EqualityAdapter to use. + Self. - + - Verifies that two objects are equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are not equal an is thrown. + Flag the constraint to use the supplied IComparer object. - The value that is expected - The actual value - The message to display in case of failure + The IComparer object to use. + Self. - + - Verifies that two objects are equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are not equal an is thrown. + Flag the constraint to use the supplied IComparer object. - The value that is expected - The actual value + The IComparer object to use. + Self. - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + Flag the constraint to use the supplied Comparison object. - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message + The IComparer object to use. + Self. - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + Flag the constraint to use the supplied IEqualityComparer object. - The expected value - The actual value - The message to display in case of failure + The IComparer object to use. + Self. - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + Flag the constraint to use the supplied IEqualityComparer object. - The expected value - The actual value + The IComparer object to use. + Self. - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + Compares two collection members for equality - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + Return a new CollectionTally for use in making tests - The expected value - The actual value - The message to display in case of failure + The collection to be included in the tally - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + Flag the constraint to ignore case and return self. - The expected value - The actual value - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + Construct a CollectionContainsConstraint - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message + - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + Test whether the expected item is contained in the collection - The expected value - The actual value - The message to display in case of failure + + - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + Write a descripton of the constraint to a MessageWriter - The expected value - The actual value + - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + CollectionEquivalentCOnstraint is used to determine whether two + collections are equivalent. - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + Construct a CollectionEquivalentConstraint - The expected value - The actual value - The message to display in case of failure + - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + Test whether two collections are equivalent - The expected value - The actual value + + - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + Write a description of this constraint to a MessageWriter - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message + - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + CollectionOrderedConstraint is used to test whether a collection is ordered. - The expected value - The actual value - The message to display in case of failure - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + Construct a CollectionOrderedConstraint - The expected value - The actual value - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + Modifies the constraint to use an IComparer and returns self. - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + Modifies the constraint to use an IComparer<T> and returns self. - The expected value - The actual value - The message to display in case of failure - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + Modifies the constraint to use a Comparison<T> and returns self. - The expected value - The actual value - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + Modifies the constraint to test ordering by the value of + a specified property and returns self. - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + Test whether the collection is ordered - The expected value - The actual value - The message to display in case of failure + + - + - Verifies that two values are not equal. If they are equal, then an - is thrown. + Write a description of the constraint to a MessageWriter - The expected value - The actual value + - + - Verifies that two objects are not equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are equal an is thrown. + Returns the string representation of the constraint. - The value that is expected - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message + - + - Verifies that two objects are not equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are equal an is thrown. + If used performs a reverse comparison - The value that is expected - The actual value - The message to display in case of failure - + - Verifies that two objects are not equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are equal an is thrown. + CollectionSubsetConstraint is used to determine whether + one collection is a subset of another - The value that is expected - The actual value - + - Asserts that two objects refer to the same object. If they - are not the same an is thrown. + Construct a CollectionSubsetConstraint - The expected object - The actual object - The message to display in case of failure - Array of objects to be used in formatting the message + The collection that the actual value is expected to be a subset of - + - Asserts that two objects refer to the same object. If they - are not the same an is thrown. + Test whether the actual collection is a subset of + the expected collection provided. - The expected object - The actual object - The message to display in case of failure + + - + - Asserts that two objects refer to the same object. If they - are not the same an is thrown. + Write a description of this constraint to a MessageWriter - The expected object - The actual object + - + - Asserts that two objects do not refer to the same object. If they - are the same an is thrown. + CollectionTally counts (tallies) the number of + occurences of each object in one or more enumerations. - The expected object - The actual object - The message to display in case of failure - Array of objects to be used in formatting the message - + - Asserts that two objects do not refer to the same object. If they - are the same an is thrown. + Construct a CollectionTally object from a comparer and a collection - The expected object - The actual object - The message to display in case of failure - + - Asserts that two objects do not refer to the same object. If they - are the same an is thrown. + Try to remove an object from the tally - The expected object - The actual object + The object to remove + True if successful, false if the object was not found - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Try to remove a set of objects from the tally - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message + The objects to remove + True if successful, false if any object was not found - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + The number of objects remaining in the tally - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + ComparisonAdapter class centralizes all comparisons of + values in NUnit, adapting to the use of any provided + IComparer, IComparer<T> or Comparison<T> - The first value, expected to be greater - The second value, expected to be less - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Returns a ComparisonAdapter that wraps an IComparer - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Returns a ComparisonAdapter that wraps an IComparer<T> - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Returns a ComparisonAdapter that wraps a Comparison<T> - The first value, expected to be greater - The second value, expected to be less - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Compares two objects - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Gets the default ComparisonAdapter, which wraps an + NUnitComparer object. - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Construct a ComparisonAdapter for an IComparer - The first value, expected to be greater - The second value, expected to be less - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Compares two objects - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message + + + - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Construct a default ComparisonAdapter - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + ComparisonAdapter<T> extends ComparisonAdapter and + allows use of an IComparer<T> or Comparison<T> + to actually perform the comparison. - The first value, expected to be greater - The second value, expected to be less - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Construct a ComparisonAdapter for an IComparer<T> - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Compare a Type T to an object - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Construct a ComparisonAdapter for a Comparison<T> - The first value, expected to be greater - The second value, expected to be less - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Compare a Type T to an object - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Abstract base class for constraints that compare values to + determine if one is greater than, equal to or less than + the other. This class supplies the Using modifiers. - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + ComparisonAdapter to be used in making the comparison - The first value, expected to be greater - The second value, expected to be less - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Initializes a new instance of the class. - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Initializes a new instance of the class. - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Modifies the constraint to use an IComparer and returns self - The first value, expected to be greater - The second value, expected to be less - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Modifies the constraint to use an IComparer<T> and returns self - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Modifies the constraint to use a Comparison<T> and returns self - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - + - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. + Delegate used to delay evaluation of the actual value + to be used in evaluating a constraint - The first value, expected to be greater - The second value, expected to be less - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + ConstraintBuilder maintains the stacks that are used in + processing a ConstraintExpression. An OperatorStack + is used to hold operators that are waiting for their + operands to be reognized. a ConstraintStack holds + input constraints as well as the results of each + operator applied. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + Initializes a new instance of the class. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + Appends the specified operator to the expression by first + reducing the operator stack and then pushing the new + operator on the stack. - The first value, expected to be less - The second value, expected to be greater + The operator to push. - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + Appends the specified constraint to the expresson by pushing + it on the constraint stack. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message + The constraint to push. - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + Sets the top operator right context. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure + The right context. - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + Reduces the operator stack until the topmost item + precedence is greater than or equal to the target precedence. - The first value, expected to be less - The second value, expected to be greater + The target precedence. - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + Resolves this instance, returning a Constraint. If the builder + is not currently in a resolvable state, an exception is thrown. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message + The resolved constraint - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + Gets a value indicating whether this instance is resolvable. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure + + true if this instance is resolvable; otherwise, false. + - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + OperatorStack is a type-safe stack for holding ConstraintOperators - The first value, expected to be less - The second value, expected to be greater - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + Initializes a new instance of the class. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message + The builder. - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + Pushes the specified operator onto the stack. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure + The op. - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + Pops the topmost operator from the stack. - The first value, expected to be less - The second value, expected to be greater + - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + Gets a value indicating whether this is empty. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message + true if empty; otherwise, false. - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + Gets the topmost operator without modifying the stack. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure + The top. - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + ConstraintStack is a type-safe stack for holding Constraints - The first value, expected to be less - The second value, expected to be greater - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + Initializes a new instance of the class. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message + The builder. - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + Pushes the specified constraint. As a side effect, + the constraint's builder field is set to the + ConstraintBuilder owning this stack. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure + The constraint. - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + Pops this topmost constrait from the stack. + As a side effect, the constraint's builder + field is set to null. - The first value, expected to be less - The second value, expected to be greater + - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + Gets a value indicating whether this is empty. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message + true if empty; otherwise, false. - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + Gets the topmost constraint without modifying the stack. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure + The topmost constraint - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + ConstraintExpression represents a compound constraint in the + process of being constructed from a series of syntactic elements. + + Individual elements are appended to the expression as they are + reognized. Once an actual Constraint is appended, the expression + returns a resolvable Constraint. - The first value, expected to be less - The second value, expected to be greater - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + ConstraintExpressionBase is the abstract base class for the + ConstraintExpression class, which represents a + compound constraint in the process of being constructed + from a series of syntactic elements. + + NOTE: ConstraintExpressionBase is separate because the + ConstraintExpression class was generated in earlier + versions of NUnit. The two classes may be combined + in a future version. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + The ConstraintBuilder holding the elements recognized so far - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - + - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. + Initializes a new instance of the class. - The first value, expected to be less - The second value, expected to be greater - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Initializes a new instance of the + class passing in a ConstraintBuilder, which may be pre-populated. - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message + The builder. - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Returns a string representation of the expression as it + currently stands. This should only be used for testing, + since it has the side-effect of resolving the expression. - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure + - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Appends an operator to the expression and returns the + resulting expression itself. - The first value, expected to be greater - The second value, expected to be less - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Appends a self-resolving operator to the expression and + returns a new ResolvableConstraintExpression. - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Appends a constraint to the expression and returns that + constraint, which is associated with the current state + of the expression being built. - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Initializes a new instance of the class. - The first value, expected to be greater - The second value, expected to be less - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Initializes a new instance of the + class passing in a ConstraintBuilder, which may be pre-populated. - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message + The builder. - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. - The first value, expected to be greater - The second value, expected to be less - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Returns the constraint provided as an argument - used to allow custom + custom constraints to easily participate in the syntax. - The first value, expected to be greater - The second value, expected to be less - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Returns the constraint provided as an argument - used to allow custom + custom constraints to easily participate in the syntax. - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Returns a constraint that tests two items for equality - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Returns a constraint that tests that two references are the same object - The first value, expected to be greater - The second value, expected to be less - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the + actual value is greater than the suppled argument - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument - The first value, expected to be greater - The second value, expected to be less - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the + actual value is less than the suppled argument - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument - The first value, expected to be greater - The second value, expected to be less - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - + - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. - The first value, expected to be greater - The second value, expected to be less - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. - The first value, expected to be less - The second value, expected to be greater - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. - The first value, expected to be less - The second value, expected to be greater - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. - The first value, expected to be less - The second value, expected to be greater - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. - The first value, expected to be less - The second value, expected to be greater - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. - The first value, expected to be less - The second value, expected to be greater - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. - The first value, expected to be less - The second value, expected to be greater - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. - The first value, expected to be less - The second value, expected to be greater - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - + - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. + Returns a constraint that tests whether the actual value falls + within a specified range. - The first value, expected to be less - The second value, expected to be greater - + - Asserts that an object is contained in a list. + Returns a ConstraintExpression that negates any + following constraint. - The expected object - The list to be examined - The message to display in case of failure - Array of objects to be used in formatting the message - + - Asserts that an object is contained in a list. + Returns a ConstraintExpression that negates any + following constraint. - The expected object - The list to be examined - The message to display in case of failure - + - Asserts that an object is contained in a list. - - The expected object - The list to be examined + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + - + - Gets the number of assertions executed so far and - resets the counter to zero. + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. - + - AssertionHelper is an optional base class for user tests, - allowing the use of shorter names for constraints and - asserts and avoiding conflict with the definition of - , from which it inherits much of its - behavior, in certain mock object frameworks. + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. Works - identically to Assert.That + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. - A Constraint to be applied - The actual value to test - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. Works - identically to Assert.That. + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. - A Constraint to be applied - The actual value to test - The message that will be displayed on failure - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. Works - identically to Assert.That + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. - A Constraint to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + With is currently a NOP - reserved for future use. - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - The message that will be displayed on failure - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + Returns a constraint that tests for null - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message - + - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + Returns a constraint that tests for True - A Constraint to be applied - The actual value to test - + - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + Returns a constraint that tests for False - A Constraint to be applied - The actual value to test - The message that will be displayed on failure - + - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. + Returns a constraint that tests for a positive value - A Constraint to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - + - Asserts that a condition is true. If the condition is false the method throws - an . Works Identically to Assert.That. - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message + Returns a constraint that tests for a negative value + - + - Asserts that a condition is true. If the condition is false the method throws - an . Works Identically to Assert.That. + Returns a constraint that tests for NaN - The evaluated condition - The message to display if the condition is false - + - Asserts that a condition is true. If the condition is false the method throws - an . Works Identically Assert.That. + Returns a constraint that tests for empty - The evaluated condition - + - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. + Returns a constraint that tests whether a collection + contains all unique items. - A TestDelegate to be executed - A ThrowsConstraint used in the test - + - Returns a ListMapper based on a collection. + Returns a constraint that tests whether an object graph is serializable in binary format. - The original collection - - + - Provides static methods to express the assumptions - that must be met for a test to give a meaningful - result. If an assumption is not met, the test - should produce an inconclusive result. + Returns a constraint that tests whether an object graph is serializable in xml format. - + - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. + Returns a constraint that tests whether a collection is ordered - - - + - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. + ContainsConstraint tests a whether a string contains a substring + or a collection contains an object. It postpones the decision of + which test to use until the type of the actual argument is known. + This allows testing whether a string is contained in a collection + or as a substring of another string using the same syntax. - - - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. + Initializes a new instance of the class. - A Constraint expression to be applied - The actual value to test + The expected. - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. + Test whether the constraint is satisfied by a given value - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure + The value to be tested + True for success, false for failure - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. + Write the constraint description to a MessageWriter - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message + The writer on which the description is displayed - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. + Flag the constraint to use the supplied IComparer object. - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested + The IComparer object to use. + Self. - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. + Flag the constraint to use the supplied IComparer object. - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - The message that will be displayed on failure + The IComparer object to use. + Self. - + - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. + Flag the constraint to use the supplied Comparison object. - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message + The IComparer object to use. + Self. - + - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. + Flag the constraint to use the supplied IEqualityComparer object. - A Constraint expression to be applied - The actual value to test + The IComparer object to use. + Self. - + - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. + Flag the constraint to use the supplied IEqualityComparer object. - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure + The IComparer object to use. + Self. - + - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. + Flag the constraint to ignore case and return self. - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - + - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message + Applies a delay to the match so that a match can be evaluated in the future. + - + - Asserts that a condition is true. If the condition is false the method throws - an . + Creates a new DelayedConstraint - The evaluated condition - The message to display if the condition is false + The inner constraint two decorate + The time interval after which the match is performed + If the value of is less than 0 - + - Asserts that a condition is true. If the condition is false the - method throws an . + Creates a new DelayedConstraint - The evaluated condition + The inner constraint two decorate + The time interval after which the match is performed + The time interval used for polling + If the value of is less than 0 - + - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. + Test whether the constraint is satisfied by a given value - A TestDelegate to be executed - A ThrowsConstraint used in the test + The value to be tested + True for if the base constraint fails, false if it succeeds - + - A set of Assert methods operationg on one or more collections + Test whether the constraint is satisfied by a delegate + The delegate whose value is to be tested + True for if the base constraint fails, false if it succeeds - + - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. + Test whether the constraint is satisfied by a given reference. + Overridden to wait for the specified delay period before + calling the base constraint with the dereferenced value. - - + A reference to the value to be tested + True for success, false for failure - + - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. + Write the constraint description to a MessageWriter - - + The writer on which the description is displayed - + - Asserts that all items contained in collection are of the type specified by expectedType. + Write the actual value for a failing constraint test to a MessageWriter. - IEnumerable containing objects to be considered - System.Type that all objects in collection must be instances of + The writer on which the actual value is displayed - + - Asserts that all items contained in collection are of the type specified by expectedType. + Returns the string representation of the constraint. - IEnumerable containing objects to be considered - System.Type that all objects in collection must be instances of - The message that will be displayed on failure - + - Asserts that all items contained in collection are of the type specified by expectedType. + EmptyCollectionConstraint tests whether a collection is empty. - IEnumerable containing objects to be considered - System.Type that all objects in collection must be instances of - The message that will be displayed on failure - Arguments to be used in formatting the message - + - Asserts that all items contained in collection are not equal to null. + Check that the collection is empty - IEnumerable containing objects to be considered + + - + - Asserts that all items contained in collection are not equal to null. + Write the constraint description to a MessageWriter - IEnumerable containing objects to be considered - The message that will be displayed on failure + - + - Asserts that all items contained in collection are not equal to null. + EmptyConstraint tests a whether a string or collection is empty, + postponing the decision about which test is applied until the + type of the actual argument is known. - IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - + - Ensures that every object contained in collection exists within the collection - once and only once. + Test whether the constraint is satisfied by a given value - IEnumerable of objects to be considered + The value to be tested + True for success, false for failure - + - Ensures that every object contained in collection exists within the collection - once and only once. + Write the constraint description to a MessageWriter - IEnumerable of objects to be considered - The message that will be displayed on failure + The writer on which the description is displayed - + - Ensures that every object contained in collection exists within the collection - once and only once. + EmptyDirectoryConstraint is used to test that a directory is empty - IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - + - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. + Test whether the constraint is satisfied by a given value - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered + The value to be tested + True for success, false for failure - + - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - If comparer is not null then it will be used to compare the objects. + Write the constraint description to a MessageWriter - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable + The writer on which the description is displayed - + - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure + The writer on which the actual value is displayed - + - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - If comparer is not null then it will be used to compare the objects. + EmptyStringConstraint tests whether a string is empty. - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - The message that will be displayed on failure - + - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. + Test whether the constraint is satisfied by a given value - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message + The value to be tested + True for success, false for failure - + - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - If comparer is not null then it will be used to compare the objects. + Write the constraint description to a MessageWriter - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - The message that will be displayed on failure - Arguments to be used in formatting the message + The writer on which the description is displayed - + - Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + EndsWithConstraint can test whether a string ends + with an expected substring. - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - + - Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + StringConstraint is the abstract base for constraints + that operate on strings. It supports the IgnoreCase + modifier for string operations. - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - + - Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + The expected value - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - + - Asserts that expected and actual are not exactly equal. + Indicates whether tests should be case-insensitive - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - + - Asserts that expected and actual are not exactly equal. - If comparer is not null then it will be used to compare the objects. + Constructs a StringConstraint given an expected value - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable + The expected value - + - Asserts that expected and actual are not exactly equal. + Test whether the constraint is satisfied by a given value - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure + The value to be tested + True for success, false for failure - + - Asserts that expected and actual are not exactly equal. - If comparer is not null then it will be used to compare the objects. + Test whether the constraint is satisfied by a given string - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - The message that will be displayed on failure + The string to be tested + True for success, false for failure - + - Asserts that expected and actual are not exactly equal. + Modify the constraint to ignore case in matching. - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - + - Asserts that expected and actual are not exactly equal. - If comparer is not null then it will be used to compare the objects. + Initializes a new instance of the class. - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - The message that will be displayed on failure - Arguments to be used in formatting the message + The expected string - + - Asserts that expected and actual are not equivalent. + Test whether the constraint is matched by the actual value. + This is a template method, which calls the IsMatch method + of the derived class. - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered + + - + - Asserts that expected and actual are not equivalent. + Write the constraint description to a MessageWriter - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure + The writer on which the description is displayed - + - Asserts that expected and actual are not equivalent. + EqualConstraint is able to compare an actual value with the + expected value provided in its constructor. Two objects are + considered equal if both are null, or if both have the same + value. NUnit has special semantics for some object types. - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - + - Asserts that collection contains actual as an item. + If true, strings in error messages will be clipped - IEnumerable of objects to be considered - Object to be found within collection - + - Asserts that collection contains actual as an item. + NUnitEqualityComparer used to test equality. - IEnumerable of objects to be considered - Object to be found within collection - The message that will be displayed on failure - + - Asserts that collection contains actual as an item. + Initializes a new instance of the class. - IEnumerable of objects to be considered - Object to be found within collection - The message that will be displayed on failure - Arguments to be used in formatting the message + The expected value. - + - Asserts that collection does not contain actual as an item. + Flag the constraint to use a tolerance when determining equality. - IEnumerable of objects to be considered - Object that cannot exist within collection + Tolerance value to be used + Self. - + - Asserts that collection does not contain actual as an item. + Flag the constraint to use the supplied IComparer object. - IEnumerable of objects to be considered - Object that cannot exist within collection - The message that will be displayed on failure + The IComparer object to use. + Self. - + - Asserts that collection does not contain actual as an item. + Flag the constraint to use the supplied IComparer object. - IEnumerable of objects to be considered - Object that cannot exist within collection - The message that will be displayed on failure - Arguments to be used in formatting the message + The IComparer object to use. + Self. - + - Asserts that superset is not a subject of subset. + Flag the constraint to use the supplied IComparer object. - The IEnumerable superset to be considered - The IEnumerable subset to be considered + The IComparer object to use. + Self. - + - Asserts that superset is not a subject of subset. + Flag the constraint to use the supplied Comparison object. - The IEnumerable superset to be considered - The IEnumerable subset to be considered - The message that will be displayed on failure + The IComparer object to use. + Self. - + - Asserts that superset is not a subject of subset. + Flag the constraint to use the supplied IEqualityComparer object. - The IEnumerable superset to be considered - The IEnumerable subset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message + The IComparer object to use. + Self. - + - Asserts that superset is a subset of subset. + Flag the constraint to use the supplied IEqualityComparer object. - The IEnumerable superset to be considered - The IEnumerable subset to be considered + The IComparer object to use. + Self. - + - Asserts that superset is a subset of subset. + Test whether the constraint is satisfied by a given value - The IEnumerable superset to be considered - The IEnumerable subset to be considered - The message that will be displayed on failure + The value to be tested + True for success, false for failure - + - Asserts that superset is a subset of subset. + Write a failure message. Overridden to provide custom + failure messages for EqualConstraint. - The IEnumerable superset to be considered - The IEnumerable subset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message + The MessageWriter to write to - + - Assert that an array, list or other collection is empty + Write description of this constraint - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message + The MessageWriter to write to - + - Assert that an array, list or other collection is empty + Display the failure information for two collections that did not match. - An array, list or other collection implementing IEnumerable - The message to be displayed on failure + The MessageWriter on which to display + The expected collection. + The actual collection + The depth of this failure in a set of nested collections - + - Assert that an array,list or other collection is empty + Displays a single line showing the types and sizes of the expected + and actual enumerations, collections or arrays. If both are identical, + the value is only shown once. - An array, list or other collection implementing IEnumerable + The MessageWriter on which to display + The expected collection or array + The actual collection or array + The indentation level for the message line - + - Assert that an array, list or other collection is empty + Displays a single line showing the point in the expected and actual + arrays at which the comparison failed. If the arrays have different + structures or dimensions, both values are shown. - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message + The MessageWriter on which to display + The expected array + The actual array + Index of the failure point in the underlying collections + The indentation level for the message line - + - Assert that an array, list or other collection is empty + Display the failure information for two IEnumerables that did not match. - An array, list or other collection implementing IEnumerable - The message to be displayed on failure + The MessageWriter on which to display + The expected enumeration. + The actual enumeration + The depth of this failure in a set of nested collections - + - Assert that an array,list or other collection is empty + Flag the constraint to ignore case and return self. - An array, list or other collection implementing IEnumerable - + - Assert that an array, list or other collection is ordered + Flag the constraint to suppress string clipping + and return self. - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message - + - Assert that an array, list or other collection is ordered + Flag the constraint to compare arrays as collections + and return self. - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - + - Assert that an array, list or other collection is ordered + Switches the .Within() modifier to interpret its tolerance as + a distance in representable values (see remarks). - An array, list or other collection implementing IEnumerable + Self. + + Ulp stands for "unit in the last place" and describes the minimum + amount a given value can change. For any integers, an ulp is 1 whole + digit. For floating point values, the accuracy of which is better + for smaller numbers and worse for larger numbers, an ulp depends + on the size of the number. Using ulps for comparison of floating + point results instead of fixed tolerances is safer because it will + automatically compensate for the added inaccuracy of larger numbers. + - + - Assert that an array, list or other collection is ordered + Switches the .Within() modifier to interpret its tolerance as + a percentage that the actual values is allowed to deviate from + the expected value. - An array, list or other collection implementing IEnumerable - A custom comparer to perform the comparisons - The message to be displayed on failure - Arguments to be used in formatting the message + Self - + - Assert that an array, list or other collection is ordered + Causes the tolerance to be interpreted as a TimeSpan in days. - An array, list or other collection implementing IEnumerable - A custom comparer to perform the comparisons - The message to be displayed on failure + Self - + - Assert that an array, list or other collection is ordered + Causes the tolerance to be interpreted as a TimeSpan in hours. - An array, list or other collection implementing IEnumerable - A custom comparer to perform the comparisons + Self - + - Static helper class used in the constraint-based syntax + Causes the tolerance to be interpreted as a TimeSpan in minutes. + Self - + - Creates a new SubstringConstraint + Causes the tolerance to be interpreted as a TimeSpan in seconds. - The value of the substring - A SubstringConstraint + Self - + - Creates a new CollectionContainsConstraint. + Causes the tolerance to be interpreted as a TimeSpan in milliseconds. - The item that should be found. - A new CollectionContainsConstraint + Self - + - Summary description for DirectoryAssert + Causes the tolerance to be interpreted as a TimeSpan in clock ticks. + Self - + - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - + EqualityAdapter class handles all equality comparisons + that use an IEqualityComparer, IEqualityComparer<T> + or a ComparisonAdapter. + - + - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. + Compares two objects, returning true if they are equal - - - + - We don't actually want any instances of this object, but some people - like to inherit from it to add other static methods. Hence, the - protected constructor disallows any instances of this object. + Returns true if the two objects can be compared by this adapter. + The base adapter cannot handle IEnumerables except for strings. - + - Verifies that two directories are equal. Two directories are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. + Returns an EqualityAdapter that wraps an IComparer. - A directory containing the value that is expected - A directory containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - + - Verifies that two directories are equal. Two directories are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. + Returns an EqualityAdapter that wraps an IEqualityComparer. - A directory containing the value that is expected - A directory containing the actual value - The message to display if directories are not equal - + - Verifies that two directories are equal. Two directories are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. + Returns an EqualityAdapter that wraps an IEqualityComparer<T>. - A directory containing the value that is expected - A directory containing the actual value - + - Verifies that two directories are equal. Two directories are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. + Returns an EqualityAdapter that wraps an IComparer<T>. - A directory path string containing the value that is expected - A directory path string containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - + - Verifies that two directories are equal. Two directories are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. + Returns an EqualityAdapter that wraps a Comparison<T>. - A directory path string containing the value that is expected - A directory path string containing the actual value - The message to display if directories are not equal - + - Verifies that two directories are equal. Two directories are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. + EqualityAdapter that wraps an IComparer. - A directory path string containing the value that is expected - A directory path string containing the actual value - + - Asserts that two directories are not equal. If they are equal - an is thrown. + Returns true if the two objects can be compared by this adapter. + Generic adapter requires objects of the specified type. - A directory containing the value that is expected - A directory containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - + - Asserts that two directories are not equal. If they are equal - an is thrown. + EqualityAdapter that wraps an IComparer. - A directory containing the value that is expected - A directory containing the actual value - The message to display if directories are not equal - + - Asserts that two directories are not equal. If they are equal - an is thrown. + EqualityAdapterList represents a list of EqualityAdapters + in a common class across platforms. - A directory containing the value that is expected - A directory containing the actual value - + - Asserts that two directories are not equal. If they are equal - an is thrown. + ExactCountConstraint applies another constraint to each + item in a collection, succeeding only if a specified + number of items succeed. - A directory path string containing the value that is expected - A directory path string containing the actual value - The message to display if directories are equal - Arguments to be used in formatting the message - + - Asserts that two directories are not equal. If they are equal - an is thrown. + Construct an ExactCountConstraint on top of an existing constraint - A directory path string containing the value that is expected - A directory path string containing the actual value - The message to display if directories are equal + + - + - Asserts that two directories are not equal. If they are equal - an is thrown. + Apply the item constraint to each item in the collection, + succeeding only if the expected number of items pass. - A directory path string containing the value that is expected - A directory path string containing the actual value + + - + - Asserts that the directory is empty. If it is not empty - an is thrown. + Write a description of this constraint to a MessageWriter - A directory to search - The message to display if directories are not equal - Arguments to be used in formatting the message + - + - Asserts that the directory is empty. If it is not empty - an is thrown. + ExactTypeConstraint is used to test that an object + is of the exact type provided in the constructor - A directory to search - The message to display if directories are not equal - + - Asserts that the directory is empty. If it is not empty - an is thrown. + Construct an ExactTypeConstraint for a given Type - A directory to search + The expected Type. - + - Asserts that the directory is empty. If it is not empty - an is thrown. + Test that an object is of the exact type specified - A directory to search - The message to display if directories are not equal - Arguments to be used in formatting the message + The actual value. + True if the tested object is of the exact type provided, otherwise false. - + - Asserts that the directory is empty. If it is not empty - an is thrown. + Write the description of this constraint to a MessageWriter - A directory to search - The message to display if directories are not equal + The MessageWriter to use - + - Asserts that the directory is empty. If it is not empty - an is thrown. + ExceptionTypeConstraint is a special version of ExactTypeConstraint + used to provided detailed info about the exception thrown in + an error message. - A directory to search - + - Asserts that the directory is not empty. If it is empty - an is thrown. + Constructs an ExceptionTypeConstraint - A directory to search - The message to display if directories are not equal - Arguments to be used in formatting the message - + - Asserts that the directory is not empty. If it is empty - an is thrown. + Write the actual value for a failing constraint test to a + MessageWriter. Overriden to write additional information + in the case of an Exception. - A directory to search - The message to display if directories are not equal + The MessageWriter to use - + - Asserts that the directory is not empty. If it is empty - an is thrown. + FailurePoint class represents one point of failure + in an equality test. - A directory to search - + - Asserts that the directory is not empty. If it is empty - an is thrown. + The location of the failure - A directory to search - The message to display if directories are not equal - Arguments to be used in formatting the message - + - Asserts that the directory is not empty. If it is empty - an is thrown. + The expected value - A directory to search - The message to display if directories are not equal - + - Asserts that the directory is not empty. If it is empty - an is thrown. + The actual value - A directory to search - + - Asserts that path contains actual as a subdirectory or - an is thrown. + Indicates whether the expected value is valid - A directory to search - sub-directory asserted to exist under directory - The message to display if directory is not within the path - Arguments to be used in formatting the message - + - Asserts that path contains actual as a subdirectory or - an is thrown. + Indicates whether the actual value is valid - A directory to search - sub-directory asserted to exist under directory - The message to display if directory is not within the path - + - Asserts that path contains actual as a subdirectory or - an is thrown. + FailurePointList represents a set of FailurePoints + in a cross-platform way. - A directory to search - sub-directory asserted to exist under directory - + - Asserts that path contains actual as a subdirectory or - an is thrown. + FalseConstraint tests that the actual value is false - A directory to search - sub-directory asserted to exist under directory - The message to display if directory is not within the path - Arguments to be used in formatting the message - + - Asserts that path contains actual as a subdirectory or - an is thrown. + Initializes a new instance of the class. + + + + Helper routines for working with floating point numbers + + + The floating point comparison code is based on this excellent article: + http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm + + + "ULP" means Unit in the Last Place and in the context of this library refers to + the distance between two adjacent floating point numbers. IEEE floating point + numbers can only represent a finite subset of natural numbers, with greater + accuracy for smaller numbers and lower accuracy for very large numbers. + + + If a comparison is allowed "2 ulps" of deviation, that means the values are + allowed to deviate by up to 2 adjacent floating point values, which might be + as low as 0.0000001 for small numbers or as high as 10.0 for large numbers. + + + + + Compares two floating point values for equality + First floating point value to be compared + Second floating point value t be compared + + Maximum number of representable floating point values that are allowed to + be between the left and the right floating point values + + True if both numbers are equal or close to being equal + + + Floating point values can only represent a finite subset of natural numbers. + For example, the values 2.00000000 and 2.00000024 can be stored in a float, + but nothing inbetween them. + + + This comparison will count how many possible floating point values are between + the left and the right number. If the number of possible values between both + numbers is less than or equal to maxUlps, then the numbers are considered as + being equal. + + + Implementation partially follows the code outlined here: + http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ + + + + + Compares two double precision floating point values for equality + First double precision floating point value to be compared + Second double precision floating point value t be compared + + Maximum number of representable double precision floating point values that are + allowed to be between the left and the right double precision floating point values + + True if both numbers are equal or close to being equal + + + Double precision floating point values can only represent a limited series of + natural numbers. For example, the values 2.0000000000000000 and 2.0000000000000004 + can be stored in a double, but nothing inbetween them. + + + This comparison will count how many possible double precision floating point + values are between the left and the right number. If the number of possible + values between both numbers is less than or equal to maxUlps, then the numbers + are considered as being equal. + + + Implementation partially follows the code outlined here: + http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ + + + + + + Reinterprets the memory contents of a floating point value as an integer value + + + Floating point value whose memory contents to reinterpret + + + The memory contents of the floating point value interpreted as an integer + + + + + Reinterprets the memory contents of a double precision floating point + value as an integer value + + + Double precision floating point value whose memory contents to reinterpret + + + The memory contents of the double precision floating point value + interpreted as an integer + + + + + Reinterprets the memory contents of an integer as a floating point value + + Integer value whose memory contents to reinterpret + + The memory contents of the integer value interpreted as a floating point value + + + + + Reinterprets the memory contents of an integer value as a double precision + floating point value + + Integer whose memory contents to reinterpret + + The memory contents of the integer interpreted as a double precision + floating point value + + + + Union of a floating point variable and an integer + + + The union's value as a floating point variable + + + The union's value as an integer + + + The union's value as an unsigned integer + + + Union of a double precision floating point variable and a long + + + The union's value as a double precision floating point variable + + + The union's value as a long + + + The union's value as an unsigned long + + + + Tests whether a value is greater than the value supplied to its constructor + + + + + The value against which a comparison is to be made + + + + + Initializes a new instance of the class. + + The expected value. + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Tests whether a value is greater than or equal to the value supplied to its constructor + + + + + The value against which a comparison is to be made - A directory to search - sub-directory asserted to exist under directory - The message to display if directory is not within the path - + - Asserts that path contains actual as a subdirectory or - an is thrown. + Initializes a new instance of the class. - A directory to search - sub-directory asserted to exist under directory + The expected value. - + - Asserts that path does not contain actual as a subdirectory or - an is thrown. + Write the constraint description to a MessageWriter - A directory to search - sub-directory asserted to exist under directory - The message to display if directory is not within the path - Arguments to be used in formatting the message + The writer on which the description is displayed - + - Asserts that path does not contain actual as a subdirectory or - an is thrown. + Test whether the constraint is satisfied by a given value - A directory to search - sub-directory asserted to exist under directory - The message to display if directory is not within the path + The value to be tested + True for success, false for failure - + - Asserts that path does not contain actual as a subdirectory or - an is thrown. + InstanceOfTypeConstraint is used to test that an object + is of the same type provided or derived from it. - A directory to search - sub-directory asserted to exist under directory - + - Asserts that path does not contain actual as a subdirectory or - an is thrown. + Construct an InstanceOfTypeConstraint for the type provided - A directory to search - sub-directory asserted to exist under directory - The message to display if directory is not within the path - Arguments to be used in formatting the message + The expected Type - + - Asserts that path does not contain actual as a subdirectory or - an is thrown. + Test whether an object is of the specified type or a derived type - A directory to search - sub-directory asserted to exist under directory - The message to display if directory is not within the path + The object to be tested + True if the object is of the provided type or derives from it, otherwise false. - + - Asserts that path does not contain actual as a subdirectory or - an is thrown. + Write a description of this constraint to a MessageWriter - A directory to search - sub-directory asserted to exist under directory + The MessageWriter to use - + - Summary description for FileAssert. + Tests whether a value is less than the value supplied to its constructor - + - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. + The value against which a comparison is to be made - - - + - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. + Initializes a new instance of the class. - - + The expected value. - + - We don't actually want any instances of this object, but some people - like to inherit from it to add other static methods. Hence, the - protected constructor disallows any instances of this object. + Write the constraint description to a MessageWriter + The writer on which the description is displayed - + - Verifies that two Streams are equal. Two Streams are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. + Test whether the constraint is satisfied by a given value - The expected Stream - The actual Stream - The message to display if Streams are not equal - Arguments to be used in formatting the message + The value to be tested + True for success, false for failure - + - Verifies that two Streams are equal. Two Streams are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. + Tests whether a value is less than or equal to the value supplied to its constructor - The expected Stream - The actual Stream - The message to display if objects are not equal - + - Verifies that two Streams are equal. Two Streams are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. + The value against which a comparison is to be made - The expected Stream - The actual Stream - + - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. + Initializes a new instance of the class. - A file containing the value that is expected - A file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message + The expected value. - + - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. + Write the constraint description to a MessageWriter - A file containing the value that is expected - A file containing the actual value - The message to display if objects are not equal + The writer on which the description is displayed - + - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. + Test whether the constraint is satisfied by a given value - A file containing the value that is expected - A file containing the actual value + The value to be tested + True for success, false for failure - + - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. + Static methods used in creating messages - The path to a file containing the value that is expected - The path to a file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - + - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. + Static string used when strings are clipped - The path to a file containing the value that is expected - The path to a file containing the actual value - The message to display if objects are not equal - + - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. + Returns the representation of a type as used in NUnitLite. + This is the same as Type.ToString() except for arrays, + which are displayed with their declared sizes. - The path to a file containing the value that is expected - The path to a file containing the actual value + + - + - Asserts that two Streams are not equal. If they are equal - an is thrown. + Converts any control characters in a string + to their escaped representation. - The expected Stream - The actual Stream - The message to be displayed when the two Stream are the same. - Arguments to be used in formatting the message + The string to be converted + The converted string - + - Asserts that two Streams are not equal. If they are equal - an is thrown. + Return the a string representation for a set of indices into an array - The expected Stream - The actual Stream - The message to be displayed when the Streams are the same. + Array of indices for which a string is needed - + - Asserts that two Streams are not equal. If they are equal - an is thrown. + Get an array of indices representing the point in a enumerable, + collection or array corresponding to a single int index into the + collection. - The expected Stream - The actual Stream + The collection to which the indices apply + Index in the collection + Array of indices - + - Asserts that two files are not equal. If they are equal - an is thrown. + Clip a string to a given length, starting at a particular offset, returning the clipped + string with ellipses representing the removed parts - A file containing the value that is expected - A file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message + The string to be clipped + The maximum permitted length of the result string + The point at which to start clipping + The clipped string - + - Asserts that two files are not equal. If they are equal - an is thrown. + Clip the expected and actual strings in a coordinated fashion, + so that they may be displayed together. - A file containing the value that is expected - A file containing the actual value - The message to display if objects are not equal + + + + - + - Asserts that two files are not equal. If they are equal - an is thrown. + Shows the position two strings start to differ. Comparison + starts at the start index. - A file containing the value that is expected - A file containing the actual value + The expected string + The actual string + The index in the strings at which comparison should start + Boolean indicating whether case should be ignored + -1 if no mismatch found, or the index where mismatch found - + - Asserts that two files are not equal. If they are equal - an is thrown. + NaNConstraint tests that the actual value is a double or float NaN - The path to a file containing the value that is expected - The path to a file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - + - Asserts that two files are not equal. If they are equal - an is thrown. + Test that the actual value is an NaN - The path to a file containing the value that is expected - The path to a file containing the actual value - The message to display if objects are not equal + + - + - Asserts that two files are not equal. If they are equal - an is thrown. + Write the constraint description to a specified writer - The path to a file containing the value that is expected - The path to a file containing the actual value + - + - GlobalSettings is a place for setting default values used - by the framework in performing asserts. + NoItemConstraint applies another constraint to each + item in a collection, failing if any of them succeeds. - + - Default tolerance for floating point equality + Construct a NoItemConstraint on top of an existing constraint + - + - Helper class with properties and methods that supply - a number of constraints used in Asserts. + Apply the item constraint to each item in the collection, + failing if any item fails. + + - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding only if a specified number of them succeed. + Write a description of this constraint to a MessageWriter + - + - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. + NotConstraint negates the effect of some other constraint - + - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. + Initializes a new instance of the class. + The base constraint to be negated. - + - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. + Test whether the constraint is satisfied by a given value + The value to be tested + True for if the base constraint fails, false if it succeeds - + - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. + Write the constraint description to a MessageWriter + The writer on which the description is displayed - + - Returns a ConstraintExpression that negates any - following constraint. + Write the actual value for a failing constraint test to a MessageWriter. + The writer on which the actual value is displayed - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. + NullConstraint tests that the actual value is null - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. + Initializes a new instance of the class. - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. + NullEmptyStringConstraint tests whether a string is either null or empty. - + - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. + Constructs a new NullOrEmptyStringConstraint - + - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. + Test whether the constraint is satisfied by a given value + The value to be tested + True for success, false for failure - + - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. + Write the constraint description to a MessageWriter + The writer on which the description is displayed - + - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. + The Numerics class contains common operations on numeric values. - + - Interface implemented by a user fixture in order to - validate any expected exceptions. It is only called - for test methods marked with the ExpectedException - attribute. + Checks the type of the object, returning true if + the object is a numeric type. + The object to check + true if the object is a numeric type - + - Method to handle an expected exception + Checks the type of the object, returning true if + the object is a floating point numeric type. - The exception to be handled + The object to check + true if the object is a floating point numeric type - + - Helper class with properties and methods that supply - a number of constraints used in Asserts. + Checks the type of the object, returning true if + the object is a fixed point numeric type. + The object to check + true if the object is a fixed point numeric type - + - Returns a constraint that tests two items for equality + Test two numeric values for equality, performing the usual numeric + conversions and using a provided or default tolerance. If the tolerance + provided is Empty, this method may set it to a default tolerance. + The expected value + The actual value + A reference to the tolerance in effect + True if the values are equal - + - Returns a constraint that tests that two references are the same object + Compare two numeric values, performing the usual numeric conversions. + The expected value + The actual value + The relationship of the values to each other - + - Returns a constraint that tests whether the - actual value is greater than the suppled argument + NUnitComparer encapsulates NUnit's default behavior + in comparing two objects. - + - Returns a constraint that tests whether the - actual value is greater than or equal to the suppled argument + Compares two objects + + + - + - Returns a constraint that tests whether the - actual value is greater than or equal to the suppled argument + Returns the default NUnitComparer. - + - Returns a constraint that tests whether the - actual value is less than the suppled argument + Generic version of NUnitComparer + - + - Returns a constraint that tests whether the - actual value is less than or equal to the suppled argument + Compare two objects of the same type - + - Returns a constraint that tests whether the - actual value is less than or equal to the suppled argument + NUnitEqualityComparer encapsulates NUnit's handling of + equality tests between objects. - + - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. + - + - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. + Compares two objects for equality within a tolerance + The first object to compare + The second object to compare + The tolerance to use in the comparison + - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + If true, all string comparisons will ignore case - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + If true, arrays will be treated as collections, allowing + those of different dimensions to be compared - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + Comparison objects used in comparisons for some constraints. - + - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. + List of points at which a failure occured. - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + RecursionDetector used to check for recursion when + evaluating self-referencing enumerables. - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + Compares two objects for equality within a tolerance, setting + the tolerance to the actual tolerance used if an empty + tolerance is supplied. - + - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + Helper method to compare two arrays - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. + + + Method to compare two DirectoryInfo objects + first directory to compare + second directory to compare + true if equivalent, false if not - + - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. + Returns the default NUnitEqualityComparer - + - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. + Gets and sets a flag indicating whether case should + be ignored in determining equality. - + - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. + Gets and sets a flag indicating that arrays should be + compared as collections, without regard to their shape. - + - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. + Gets the list of external comparers to be used to + test for equality. They are applied to members of + collections, in place of NUnit's own logic. - + - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. + Gets the list of failure points for the last Match performed. + The list consists of objects to be interpreted by the caller. + This generally means that the caller may only make use of + objects it has placed on the list at a particular depthy. - + - Returns a constraint that succeeds if the actual - value matches the Regex pattern supplied as an argument. + RecursionDetector detects when a comparison + between two enumerables has reached a point + where the same objects that were previously + compared are again being compared. This allows + the caller to stop the comparison if desired. - + - Returns a constraint that tests whether the path provided - is the same as an expected path after canonicalization. + Check whether two objects have previously + been compared, returning true if they have. + The two objects are remembered, so that a + second call will always return true. - + - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. + OrConstraint succeeds if either member succeeds - + - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. + Create an OrConstraint from two other constraints + The first constraint + The second constraint - + - Returns a constraint that tests whether the actual value falls - within a specified range. + Apply the member constraints to an actual value, succeeding + succeeding as soon as one of them succeeds. + The actual value + True if either constraint succeeded - + - Returns a ConstraintExpression that negates any - following constraint. + Write a description for this contraint to a MessageWriter + The MessageWriter to receive the description - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. + PathConstraint serves as the abstract base of constraints + that operate on paths and provides several helper methods. - + - Returns a constraint that tests for null + The expected path used in the constraint - + - Returns a constraint that tests for True + Flag indicating whether a caseInsensitive comparison should be made - + - Returns a constraint that tests for False + Construct a PathConstraint for a give expected path + The expected path - + - Returns a constraint that tests for a positive value + Test whether the constraint is satisfied by a given value + The value to be tested + True for success, false for failure - + - Returns a constraint that tests for a negative value + Returns true if the expected path and actual path match - + - Returns a constraint that tests for NaN + Returns the string representation of this constraint - + - Returns a constraint that tests for empty + Transform the provided path to its canonical form so that it + may be more easily be compared with other paths. + The original path + The path in canonical form - + - Returns a constraint that tests whether a collection - contains all unique items. + Test whether one path in canonical form is under another. + The first path - supposed to be the parent path + The second path - supposed to be the child path + Indicates whether case should be ignored + - + - Returns a constraint that tests whether an object graph is serializable in binary format. + Modifies the current instance to be case-insensitve + and returns it. - + - Returns a constraint that tests whether an object graph is serializable in xml format. + Modifies the current instance to be case-sensitve + and returns it. - + - Returns a constraint that tests whether a collection is ordered + Predicate constraint wraps a Predicate in a constraint, + returning success if the predicate is true. - + - The Iz class is a synonym for Is intended for use in VB, - which regards Is as a keyword. + Construct a PredicateConstraint from a predicate - + - The List class is a helper class with properties and methods - that supply a number of constraints used with lists and collections. + Determines whether the predicate succeeds when applied + to the actual value. - + - List.Map returns a ListMapper, which can be used to map - the original collection to another collection. + Writes the description to a MessageWriter - - - + - ListMapper is used to transform a collection used as an actual argument - producing another collection to be used in the assertion. + PropertyConstraint extracts a named property and uses + its value as the actual value for a chained constraint. - + - Construct a ListMapper based on a collection + Initializes a new instance of the class. - The collection to be transformed + The name. + The constraint to apply to the property. - + - Produces a collection containing all the values of a property + Test whether the constraint is satisfied by a given value - The collection of property values - + The value to be tested + True for success, false for failure - + - Randomizer returns a set of random values in a repeatable - way, to allow re-running of tests if necessary. + Write the constraint description to a MessageWriter + The writer on which the description is displayed - + - Get a randomizer for a particular member, returning - one that has already been created if it exists. - This ensures that the same values are generated - each time the tests are reloaded. + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + The writer on which the actual value is displayed - + - Get a randomizer for a particular parameter, returning - one that has already been created if it exists. - This ensures that the same values are generated - each time the tests are reloaded. + Returns the string representation of the constraint. + - + - Construct a randomizer using a random seed + PropertyExistsConstraint tests that a named property + exists on the object provided through Match. + + Originally, PropertyConstraint provided this feature + in addition to making optional tests on the vaue + of the property. The two constraints are now separate. - + - Construct a randomizer using a specified seed + Initializes a new instance of the class. + The name of the property. - + - Return an array of random doubles between 0.0 and 1.0. + Test whether the property exists for a given object - - + The object to be tested + True for success, false for failure - + - Return an array of random doubles with values in a specified range. + Write the constraint description to a MessageWriter + The writer on which the description is displayed - + - Return an array of random ints with values in a specified range. + Write the actual value for a failing constraint test to a + MessageWriter. + The writer on which the actual value is displayed - + - Get a random seed for use in creating a randomizer. + Returns the string representation of the constraint. + - + - The SpecialValue enum is used to represent TestCase arguments - that cannot be used as arguments to an Attribute. + RangeConstraint tests whether two values are within a + specified range. - + - Null represents a null value, which cannot be used as an - argument to an attriute under .NET 1.x + Initializes a new instance of the class. + From. + To. - + - Basic Asserts on strings. + Test whether the constraint is satisfied by a given value + The value to be tested + True for success, false for failure - + - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. + Write the constraint description to a MessageWriter - - + The writer on which the description is displayed - + - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. + RegexConstraint can test whether a string matches + the pattern provided. - - - + - Asserts that a string is found within another string. + Initializes a new instance of the class. - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message + The pattern. - + - Asserts that a string is found within another string. + Test whether the constraint is satisfied by a given value - The expected string - The string to be examined - The message to display in case of failure + The value to be tested + True for success, false for failure - + - Asserts that a string is found within another string. + Write the constraint description to a MessageWriter - The expected string - The string to be examined + The writer on which the description is displayed - + - Asserts that a string is not found within another string. + ResolvableConstraintExpression is used to represent a compound + constraint being constructed at a point where the last operator + may either terminate the expression or may have additional + qualifying constraints added to it. + + It is used, for example, for a Property element or for + an Exception element, either of which may be optionally + followed by constraints that apply to the property or + exception. - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - + - Asserts that a string is found within another string. + Create a new instance of ResolvableConstraintExpression - The expected string - The string to be examined - The message to display in case of failure - + - Asserts that a string is found within another string. + Create a new instance of ResolvableConstraintExpression, + passing in a pre-populated ConstraintBuilder. - The expected string - The string to be examined - + - Asserts that a string starts with another string. + Resolve the current expression to a Constraint - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - + - Asserts that a string starts with another string. + This operator creates a constraint that is satisfied only if both + argument constraints are satisfied. - The expected string - The string to be examined - The message to display in case of failure - + - Asserts that a string starts with another string. + This operator creates a constraint that is satisfied only if both + argument constraints are satisfied. - The expected string - The string to be examined - + - Asserts that a string does not start with another string. + This operator creates a constraint that is satisfied only if both + argument constraints are satisfied. - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - + - Asserts that a string does not start with another string. + This operator creates a constraint that is satisfied if either + of the argument constraints is satisfied. - The expected string - The string to be examined - The message to display in case of failure - + - Asserts that a string does not start with another string. + This operator creates a constraint that is satisfied if either + of the argument constraints is satisfied. - The expected string - The string to be examined - + - Asserts that a string ends with another string. + This operator creates a constraint that is satisfied if either + of the argument constraints is satisfied. - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - + - Asserts that a string ends with another string. + This operator creates a constraint that is satisfied if the + argument constraint is not satisfied. - The expected string - The string to be examined - The message to display in case of failure - + - Asserts that a string ends with another string. + Appends an And Operator to the expression - The expected string - The string to be examined - + - Asserts that a string does not end with another string. + Appends an Or operator to the expression. - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - + - Asserts that a string does not end with another string. + ReusableConstraint wraps a constraint expression after + resolving it so that it can be reused consistently. - The expected string - The string to be examined - The message to display in case of failure - + - Asserts that a string does not end with another string. + Construct a ReusableConstraint from a constraint expression - The expected string - The string to be examined + The expression to be resolved and reused - + - Asserts that two strings are equal, without regard to case. + Converts a constraint to a ReusableConstraint - The expected string - The actual string - The message to display in case of failure - Arguments used in formatting the message + The constraint to be converted + A ReusableConstraint - + - Asserts that two strings are equal, without regard to case. + Returns the string representation of the constraint. - The expected string - The actual string - The message to display in case of failure + A string representing the constraint - + - Asserts that two strings are equal, without regard to case. + Resolves the ReusableConstraint by returning the constraint + that it originally wrapped. - The expected string - The actual string + A resolved constraint - + - Asserts that two strings are not equal, without regard to case. + SameAsConstraint tests whether an object is identical to + the object passed to its constructor - The expected string - The actual string - The message to display in case of failure - Arguments used in formatting the message - + - Asserts that two strings are Notequal, without regard to case. + Initializes a new instance of the class. - The expected string - The actual string - The message to display in case of failure + The expected object. - + - Asserts that two strings are not equal, without regard to case. + Test whether the constraint is satisfied by a given value - The expected string - The actual string + The value to be tested + True for success, false for failure - + - Asserts that a string matches an expected regular expression pattern. + Write the constraint description to a MessageWriter - The regex pattern to be matched - The actual string - The message to display in case of failure - Arguments used in formatting the message + The writer on which the description is displayed - + - Asserts that a string matches an expected regular expression pattern. + Summary description for SamePathConstraint. - The regex pattern to be matched - The actual string - The message to display in case of failure - + - Asserts that a string matches an expected regular expression pattern. + Initializes a new instance of the class. - The regex pattern to be matched - The actual string + The expected path - + - Asserts that a string does not match an expected regular expression pattern. + Test whether the constraint is satisfied by a given value - The regex pattern to be used - The actual string - The message to display in case of failure - Arguments used in formatting the message + The expected path + The actual path + True for success, false for failure - + - Asserts that a string does not match an expected regular expression pattern. + Write the constraint description to a MessageWriter - The regex pattern to be used - The actual string - The message to display in case of failure + The writer on which the description is displayed - + - Asserts that a string does not match an expected regular expression pattern. + SamePathOrUnderConstraint tests that one path is under another - The regex pattern to be used - The actual string - + - The TestCaseData class represents a set of arguments - and other parameter info to be used for a parameterized - test case. It provides a number of instance modifiers - for use in initializing the test case. - - Note: Instance modifiers are getters that return - the same instance after modifying it's state. + Initializes a new instance of the class. + The expected path - + - The argument list to be provided to the test + Test whether the constraint is satisfied by a given value + The expected path + The actual path + True for success, false for failure - + - The expected result to be returned + Write the constraint description to a MessageWriter + The writer on which the description is displayed - + - Set to true if this has an expected result + SomeItemsConstraint applies another constraint to each + item in a collection, succeeding if any of them succeeds. - + - The expected exception Type + Construct a SomeItemsConstraint on top of an existing constraint + - + - The FullName of the expected exception + Apply the item constraint to each item in the collection, + succeeding if any item succeeds. + + - + - The name to be used for the test + Write a description of this constraint to a MessageWriter + - + - The description of the test + StartsWithConstraint can test whether a string starts + with an expected substring. - + - A dictionary of properties, used to add information - to tests without requiring the class to change. + Initializes a new instance of the class. + The expected string - + - If true, indicates that the test case is to be ignored + Test whether the constraint is matched by the actual value. + This is a template method, which calls the IsMatch method + of the derived class. + + - + - If true, indicates that the test case is marked explicit + Write the constraint description to a MessageWriter + The writer on which the description is displayed - + - The reason for ignoring a test case + SubPathConstraint tests that the actual path is under the expected path - + - Initializes a new instance of the class. + Initializes a new instance of the class. - The arguments. + The expected path - + - Initializes a new instance of the class. + Test whether the constraint is satisfied by a given value - The argument. + The expected path + The actual path + True for success, false for failure - + - Initializes a new instance of the class. + Write the constraint description to a MessageWriter - The first argument. - The second argument. + The writer on which the description is displayed - + - Initializes a new instance of the class. + SubstringConstraint can test whether a string contains + the expected substring. - The first argument. - The second argument. - The third argument. - + - Sets the expected result for the test + Initializes a new instance of the class. - The expected result - A modified TestCaseData + The expected. - + - Sets the expected exception type for the test + Test whether the constraint is satisfied by a given value - Type of the expected exception. - The modified TestCaseData instance + The value to be tested + True for success, false for failure - + - Sets the expected exception type for the test + Write the constraint description to a MessageWriter - FullName of the expected exception. - The modified TestCaseData instance + The writer on which the description is displayed - + - Sets the name of the test case + ThrowsConstraint is used to test the exception thrown by + a delegate by applying a constraint to it. - The modified TestCaseData instance - + - Sets the description for the test case - being constructed. + Initializes a new instance of the class, + using a constraint to be applied to the exception. - The description. - The modified TestCaseData instance. + A constraint to apply to the caught exception. - + - Applies a category to the test + Executes the code of the delegate and captures any exception. + If a non-null base constraint was provided, it applies that + constraint to the exception. - - + A delegate representing the code to be tested + True if an exception is thrown and the constraint succeeds, otherwise false - + - Applies a named property to the test + Converts an ActualValueDelegate to a TestDelegate + before calling the primary overload. - - - - + - Applies a named property to the test + Write the constraint description to a MessageWriter - - - + The writer on which the description is displayed - + - Applies a named property to the test + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. - - - + The writer on which the actual value is displayed - + - Ignores this TestCase. + Returns the string representation of this constraint - - + - Ignores this TestCase, specifying the reason. + Get the actual exception thrown - used by Assert.Throws. - The reason. - - + - Marks this TestCase as Explicit + ThrowsNothingConstraint tests that a delegate does not + throw an exception. - - + - Marks this TestCase as Explicit, specifying the reason. + Test whether the constraint is satisfied by a given value - The reason. - + The value to be tested + True if no exception is thrown, otherwise false - + - Gets the argument list to be provided to the test + Write the constraint description to a MessageWriter + The writer on which the description is displayed - + - Gets the expected result + Write the actual value for a failing constraint test to a + MessageWriter. Overridden in ThrowsNothingConstraint to write + information about the exception that was actually caught. + The writer on which the actual value is displayed - + - Returns true if the result has been set + The Tolerance class generalizes the notion of a tolerance + within which an equality test succeeds. Normally, it is + used with numeric types, but it can be used with any + type that supports taking a difference between two + objects and comparing that difference to a value. - + - Gets the expected exception Type + Constructs a linear tolerance of a specdified amount - + - Gets the FullName of the expected exception + Constructs a tolerance given an amount and ToleranceMode - + - Gets the name to be used for the test + Tests that the current Tolerance is linear with a + numeric value, throwing an exception if it is not. - + - Gets the description of the test + Returns an empty Tolerance object, equivalent to + specifying no tolerance. In most cases, it results + in an exact match but for floats and doubles a + default tolerance may be used. - + - Gets a value indicating whether this is ignored. + Returns a zero Tolerance object, equivalent to + specifying an exact match. - true if ignored; otherwise, false. - + - Gets a value indicating whether this is explicit. + Gets the ToleranceMode for the current Tolerance - true if explicit; otherwise, false. - + - Gets the ignore reason. + Gets the value of the current Tolerance instance. - The ignore reason. - + - Gets a list of categories associated with this test. + Returns a new tolerance, using the current amount as a percentage. - + - Gets the property dictionary for this test + Returns a new tolerance, using the current amount in Ulps. - + - Provide the context information of the current test + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of days. - + - Constructs a TestContext using the provided context dictionary + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of hours. - A context dictionary - + - Get the current test context. This is created - as needed. The user may save the context for - use within a test, but it should not be used - outside the test for which it is created. + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of minutes. - + - Gets a TestAdapter representing the currently executing test in this context. + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of seconds. - + - Gets a ResultAdapter representing the current result for the test - executing in this context. + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of milliseconds. - + - Gets the directory containing the current test assembly. + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of clock ticks. - + - Gets the directory to be used for outputing files created - by this test run. + Returns true if the current tolerance is empty. - + - TestAdapter adapts a Test for consumption by - the user test code. + Modes in which the tolerance value for a comparison can be interpreted. - + - Constructs a TestAdapter for this context + The tolerance was created with a value, without specifying + how the value would be used. This is used to prevent setting + the mode more than once and is generally changed to Linear + upon execution of the test. - The context dictionary - + - The name of the test. + The tolerance is used as a numeric range within which + two compared values are considered to be equal. - + - The FullName of the test + Interprets the tolerance as the percentage by which + the two compared values my deviate from each other. - + - The properties of the test. + Compares two values based in their distance in + representable numbers. - + - ResultAdapter adapts a TestResult for consumption by - the user test code. + TrueConstraint tests that the actual value is true - + - Construct a ResultAdapter for a context + Initializes a new instance of the class. - The context holding the result - + - The TestState of current test. This maps to the ResultState - used in nunit.core and is subject to change in the future. + UniqueItemsConstraint tests whether all the items in a + collection are unique. - + - The TestStatus of current test. This enum will be used - in future versions of NUnit and so is to be preferred - to the TestState value. + Check that all items are unique. + + - + - Provides details about a test + Write a description of this constraint to a MessageWriter + - + - Creates an instance of TestDetails + XmlSerializableConstraint tests whether + an object is serializable in XML format. - The fixture that the test is a member of, if available. - The method that implements the test, if available. - The full name of the test. - A string representing the type of test, e.g. "Test Case". - Indicates if the test represents a suite of tests. - + - The fixture that the test is a member of, if available. + Test whether the constraint is satisfied by a given value + The value to be tested + True for success, false for failure - + - The method that implements the test, if available. + Write the constraint description to a MessageWriter + The writer on which the description is displayed - + - The full name of the test. + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + The writer on which the actual value is displayed - + - A string representing the type of test, e.g. "Test Case". + Returns the string representation of this constraint - + - Indicates if the test represents a suite of tests. + Represents a constraint that succeeds if all the + members of a collection match a base constraint. - + - The ResultState enum indicates the result of running a test + Abstract base for operators that indicate how to + apply a constraint to items in a collection. - + - The result is inconclusive + PrefixOperator takes a single constraint and modifies + it's action in some way. - + - The test was not runnable. + The ConstraintOperator class is used internally by a + ConstraintBuilder to represent an operator that + modifies or combines constraints. + + Constraint operators use left and right precedence + values to determine whether the top operator on the + stack should be reduced before pushing a new operator. - + - The test has been skipped. + The precedence value used when the operator + is about to be pushed to the stack. - + - The test has been ignored. + The precedence value used when the operator + is on the top of the stack. - + - The test succeeded + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + - + - The test failed + The syntax element preceding this operator - + - The test encountered an unexpected exception + The syntax element folowing this operator - + - The test was cancelled by the user + The precedence value used when the operator + is about to be pushed to the stack. - + - The TestStatus enum indicates the result of running a test + The precedence value used when the operator + is on the top of the stack. - + - The test was inconclusive + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + - + - The test has skipped + Returns the constraint created by applying this + prefix to another constraint. + + - + - The test succeeded + Constructs a CollectionOperator - + - The test failed + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + they all succeed. - + - Helper class with static methods used to supply constraints - that operate on strings. + Operator that requires both it's arguments to succeed - + - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. + Abstract base class for all binary operators - + - Returns a constraint that fails if the actual - value contains the substring supplied as an argument. + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + - + - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. + Abstract method that produces a constraint by applying + the operator to its left and right constraint arguments. - + - Returns a constraint that fails if the actual - value starts with the substring supplied as an argument. + Gets the left precedence of the operator - + - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. + Gets the right precedence of the operator - + - Returns a constraint that fails if the actual - value ends with the substring supplied as an argument. + Construct an AndOperator - + - Returns a constraint that succeeds if the actual - value matches the Regex pattern supplied as an argument. + Apply the operator to produce an AndConstraint - + - Returns a constraint that fails if the actual - value matches the pattern supplied as an argument. + Operator that tests for the presence of a particular attribute + on a type and optionally applies further tests to the attribute. - + - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. + Abstract base class for operators that are able to reduce to a + constraint whether or not another syntactic element follows. - + - TextMessageWriter writes constraint descriptions and messages - in displayable form as a text stream. It tailors the display - of individual message components to form the standard message - format of NUnit assertion failure messages. + Construct an AttributeOperator for a particular Type + The Type of attribute tested - + - Prefix used for the expected value line of a message + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. - + - Prefix used for the actual value line of a message + Represents a constraint that succeeds if the specified + count of members of a collection match a base constraint. - + - Length of a message prefix + Construct an ExactCountOperator for a specified count + The expected count - + - Construct a TextMessageWriter + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + none of them succeed. - + - Construct a TextMessageWriter, specifying a user message - and optional formatting arguments. + Represents a constraint that succeeds if none of the + members of a collection match a base constraint. - - - + - Method to write single line message with optional args, usually - written to precede the general failure message, at a givel - indentation level. + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + none of them succeed. - The indentation level of the message - The message to be written - Any arguments used in formatting the message - + - Display Expected and Actual lines for a constraint. This - is called by MessageWriter's default implementation of - WriteMessageTo and provides the generic two-line display. + Negates the test of the constraint it wraps. - The constraint that failed - + - Display Expected and Actual lines for given values. This - method may be called by constraints that need more control over - the display of actual and expected values than is provided - by the default implementation. + Constructs a new NotOperator - The expected value - The actual value causing the failure - + - Display Expected and Actual lines for given values, including - a tolerance value on the expected line. + Returns a NotConstraint applied to its argument. - The expected value - The actual value causing the failure - The tolerance within which the test was made - + - Display the expected and actual string values on separate lines. - If the mismatch parameter is >=0, an additional line is displayed - line containing a caret that points to the mismatch point. + Operator that requires at least one of it's arguments to succeed - The expected string value - The actual string value - The point at which the strings don't match or -1 - If true, case is ignored in string comparisons - If true, clip the strings to fit the max line length - + - Writes the text for a connector. + Construct an OrOperator - The connector. - + - Writes the text for a predicate. + Apply the operator to produce an OrConstraint - The predicate. - + - Write the text for a modifier. + Operator used to test for the presence of a named Property + on an object and optionally apply further tests to the + value of that property. - The modifier. - + - Writes the text for an expected value. + Constructs a PropOperator for a particular named property - The expected value. - + - Writes the text for an actual value. + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. - The actual value. + - + - Writes the text for a generalized value. + Gets the name of the property to which the operator applies - The value. - + - Writes the text for a collection value, - starting at a particular point, to a max length + Represents a constraint that succeeds if any of the + members of a collection match a base constraint. - The collection containing elements to write. - The starting point of the elements to write - The maximum number of elements to write - + - Write the generic 'Expected' line for a constraint + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + any of them succeed. - The constraint that failed - + - Write the generic 'Expected' line for a given value + Operator that tests that an exception is thrown and + optionally applies further tests to the exception. - The expected value - + - Write the generic 'Expected' line for a given value - and tolerance. + Construct a ThrowsOperator - The expected value - The tolerance within which the test was made - + - Write the generic 'Actual' line for a constraint + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. - The constraint for which the actual value is to be written - + - Write the generic 'Actual' line for a given value + Represents a constraint that simply wraps the + constraint provided as an argument, without any + further functionality, but which modifes the + order of evaluation because of its precedence. - The actual value causing a failure - + - Gets or sets the maximum line length for this writer + Constructor for the WithOperator - + - Helper class with properties and methods that supply - constraints that operate on exceptions. + Returns a constraint that wraps its argument - + - Creates a constraint specifying the exact type of exception expected + Thrown when an assertion failed. - + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + - Creates a constraint specifying the exact type of exception expected + Serialization Constructor - + - Creates a constraint specifying the type of exception expected + Thrown when an assertion failed. - + + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + - Creates a constraint specifying the type of exception expected + Serialization Constructor - + - Creates a constraint specifying an expected exception + Thrown when a test executes inconclusively. - + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + - Creates a constraint specifying an exception with a given InnerException + Serialization Constructor - + - Creates a constraint specifying an expected TargetInvocationException + Thrown when an assertion failed. - + + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + - Creates a constraint specifying an expected TargetInvocationException + Serialization Constructor - + - Creates a constraint specifying an expected TargetInvocationException + + - + - Creates a constraint specifying that no exception is thrown + Compares two objects of a given Type for equality within a tolerance + The first object to compare + The second object to compare + The tolerance to use in the comparison + diff --git a/packages/NUnit.2.6.2/license.txt b/packages/NUnit.2.6.3/license.txt similarity index 89% rename from packages/NUnit.2.6.2/license.txt rename to packages/NUnit.2.6.3/license.txt index 724e4652..b12903af 100644 --- a/packages/NUnit.2.6.2/license.txt +++ b/packages/NUnit.2.6.3/license.txt @@ -1,15 +1,15 @@ -Copyright © 2002-2012 Charlie Poole -Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov -Copyright © 2000-2002 Philip A. Craig - -This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product documentation is required. - -Portions Copyright © 2002-2012 Charlie Poole or Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov or Copyright © 2000-2002 Philip A. Craig - -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source distribution. +Copyright © 2002-2013 Charlie Poole +Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov +Copyright © 2000-2002 Philip A. Craig + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product documentation is required. + +Portions Copyright © 2002-2013 Charlie Poole or Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov or Copyright © 2000-2002 Philip A. Craig + +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. diff --git a/packages/repositories.config b/packages/repositories.config index de05d564..40e2973a 100644 --- a/packages/repositories.config +++ b/packages/repositories.config @@ -1,9 +1,9 @@  - + From daca310a1377f770b36edbd76ed9b86e7169c414 Mon Sep 17 00:00:00 2001 From: Mark Rendle Date: Mon, 4 Nov 2013 14:08:04 +0000 Subject: [PATCH 09/15] Pre-reorg --- Simple.Data.SqlTest/SimpleTest.mdf | Bin 3211264 -> 3211264 bytes Simple.Data.SqlTest/SimpleTest_log.ldf | Bin 1638400 -> 1638400 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Simple.Data.SqlTest/SimpleTest.mdf b/Simple.Data.SqlTest/SimpleTest.mdf index ebc49d8f9bd49a1b86be8af24b6ce1507b2068d2..f56af943968c281117a9f96b8747f33280469dc2 100644 GIT binary patch delta 1526 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 N`O$)CC|VdT`ak<&YGD8X delta 820 zcmZo@NNH$DnIOj`FEdd=hUKZGUdQBz9SR#0(pWaP30N{Rc28mx=j>)=U|?ckU{-iL7E1H uT3A|GTi9CITR2)cTew=dTX Date: Mon, 4 Nov 2013 14:16:34 +0000 Subject: [PATCH 10/15] Moved solution into src folder --- Assemblies/Microsoft.SqlServer.Types.dll | Bin 310624 -> 0 bytes Assemblies/System.Data.SqlServerCe.dll | Bin 296816 -> 0 bytes Assemblies/sqlceca35.dll | Bin 342384 -> 0 bytes Assemblies/sqlcecompact35.dll | Bin 83312 -> 0 bytes Assemblies/sqlceer35EN.dll | Bin 147312 -> 0 bytes Assemblies/sqlceme35.dll | Bin 63344 -> 0 bytes Assemblies/sqlceoledb35.dll | Bin 169328 -> 0 bytes Assemblies/sqlceqp35.dll | Bin 640880 -> 0 bytes Assemblies/sqlcese35.dll | Bin 361840 -> 0 bytes Simple.Data.SqlCe35/sqlceca35.dll | Bin 342384 -> 0 bytes Simple.Data.SqlCe35/sqlcecompact35.dll | Bin 83312 -> 0 bytes Simple.Data.SqlCe35/sqlceer35EN.dll | Bin 147312 -> 0 bytes Simple.Data.SqlCe35/sqlceme35.dll | Bin 63344 -> 0 bytes Simple.Data.SqlCe35/sqlceoledb35.dll | Bin 169328 -> 0 bytes Simple.Data.SqlCe35/sqlceqp35.dll | Bin 640880 -> 0 bytes Simple.Data.SqlCe35/sqlcese35.dll | Bin 361840 -> 0 bytes Simple.Data.SqlCe35Test/sqlceca35.dll | Bin 342384 -> 0 bytes Simple.Data.SqlCe35Test/sqlcecompact35.dll | Bin 83312 -> 0 bytes Simple.Data.SqlCe35Test/sqlceer35EN.dll | Bin 147312 -> 0 bytes Simple.Data.SqlCe35Test/sqlceme35.dll | Bin 63344 -> 0 bytes Simple.Data.SqlCe35Test/sqlceoledb35.dll | Bin 169328 -> 0 bytes Simple.Data.SqlCe35Test/sqlceqp35.dll | Bin 640880 -> 0 bytes Simple.Data.SqlCe35Test/sqlcese35.dll | Bin 361840 -> 0 bytes Simple.Data.SqlCe40Test/TestDatabase.sdf.bak | Bin 151552 -> 0 bytes Simple.Data.sln.DotSettings | 7 - Simple.Data/Simple.Data.csproj.vspscc | 10 - .../lib/nunit.framework.dll | Bin 139264 -> 0 bytes .../NUnit.2.5.10.11092/lib/nunit.mocks.dll | Bin 20480 -> 0 bytes .../lib/pnunit.framework.dll | Bin 6656 -> 0 bytes packages/NUnit.2.5.10.11092/tools/lib/fit.dll | Bin 49152 -> 0 bytes .../NUnit.2.5.10.11092/tools/lib/log4net.dll | Bin 258048 -> 0 bytes .../tools/lib/nunit-console-runner.dll | Bin 36864 -> 0 bytes .../tools/lib/nunit-gui-runner.dll | Bin 188416 -> 0 bytes .../tools/lib/nunit.core.dll | Bin 139264 -> 0 bytes .../tools/lib/nunit.core.interfaces.dll | Bin 57344 -> 0 bytes .../tools/lib/nunit.fixtures.dll | Bin 9728 -> 0 bytes .../tools/lib/nunit.uiexception.dll | Bin 90112 -> 0 bytes .../tools/lib/nunit.uikit.dll | Bin 258048 -> 0 bytes .../tools/lib/nunit.util.dll | Bin 126976 -> 0 bytes .../tools/nunit-agent-x86.exe | Bin 7680 -> 0 bytes .../NUnit.2.5.10.11092/tools/nunit-agent.exe | Bin 7680 -> 0 bytes .../tools/nunit-console-x86.exe | Bin 4608 -> 0 bytes .../tools/nunit-console.exe | Bin 4608 -> 0 bytes .../NUnit.2.5.10.11092/tools/nunit-x86.exe | Bin 5632 -> 0 bytes packages/NUnit.2.5.10.11092/tools/nunit.exe | Bin 5632 -> 0 bytes .../tools/nunit.framework.dll | Bin 139264 -> 0 bytes .../NUnit.2.5.10.11092/tools/pnunit-agent.exe | Bin 13824 -> 0 bytes .../tools/pnunit-launcher.exe | Bin 24576 -> 0 bytes .../tools/pnunit.framework.dll | Bin 6656 -> 0 bytes .../NUnit.2.5.10.11092/tools/pnunit.tests.dll | Bin 4608 -> 0 bytes packages/NUnit.2.5.10.11092/tools/runFile.exe | Bin 3072 -> 0 bytes .../lib/net40/Simple.Data.Ado.dll | Bin 78848 -> 0 bytes .../lib/net40/Simple.Data.dll | Bin 77312 -> 0 bytes .../lib/net40/Simple.Data.SqlCe40.dll | Bin 20992 -> 0 bytes .../NativeBinaries/amd64/sqlcecompact40.dll | Bin 104288 -> 0 bytes .../NativeBinaries/amd64/sqlceer40EN.dll | Bin 154464 -> 0 bytes .../NativeBinaries/amd64/sqlceme40.dll | Bin 80736 -> 0 bytes .../NativeBinaries/amd64/sqlceqp40.dll | Bin 908128 -> 0 bytes .../NativeBinaries/amd64/sqlcese40.dll | Bin 543072 -> 0 bytes .../NativeBinaries/x86/sqlcecompact40.dll | Bin 88416 -> 0 bytes .../NativeBinaries/x86/sqlceer40EN.dll | Bin 153952 -> 0 bytes .../NativeBinaries/x86/sqlceme40.dll | Bin 66912 -> 0 bytes .../NativeBinaries/x86/sqlceqp40.dll | Bin 642400 -> 0 bytes .../NativeBinaries/x86/sqlcese40.dll | Bin 387424 -> 0 bytes .../lib/System.Data.SqlServerCe.dll | Bin 465248 -> 0 bytes .../Trespasser.1.1/lib/net40/Trespasser.dll | Bin 6144 -> 0 bytes AutoTest.config => src/AutoTest.config | 0 .../CommonAssemblyInfo.cs | 48 +- .../PerformanceTestConsole.psess | 0 .../PerformanceTestConsole.csproj | 154 +- .../PerformanceTestConsole}/Program.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../PerformanceTestConsole}/app.config | 36 +- .../PerformanceTestConsole}/packages.config | 10 +- .../PerformanceTestConsole111123.vsp | Bin {ProfilingApp => src/ProfilingApp}/App.config | 16 +- .../ProfilingApp}/CastTask.cs | 0 .../ProfilingApp}/FindAllByTask.cs | 0 .../ProfilingApp}/FindByTask.cs | 0 .../ProfilingApp}/IProfileTask.cs | 0 .../ProfilingApp}/ProfilingApp.csproj | 210 +- {ProfilingApp => src/ProfilingApp}/Program.cs | 0 .../ProfilingApp}/Properties/AssemblyInfo.cs | 0 .../Properties/Resources.Designer.cs | 174 +- .../ProfilingApp}/Properties/Resources.resx | 0 .../Properties/Settings.Designer.cs | 72 +- .../Properties/Settings.settings | 0 .../ProfilingApp}/QueryWithCountTask.cs | 0 .../Resources/DatabaseResetSql.txt | 0 {Releases => src/Releases}/CopyReleases.cmd | 0 .../Simple.Data-Mono.sln | 0 .../Simple.Data-Mono.userprefs | 0 .../Simple.Data.AdapterApi}/DatabaseHelper.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../Simple.Data.AdapterApi.csproj | 124 +- .../AdoAdapterExceptionTest.cs | 0 .../ConnectionModifierTest.cs | 0 .../EagerLoadingEnumerableTest.cs | 0 .../Simple.Data.Ado.Test}/GraphNodeTest.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../ProviderHelperTest.cs | 0 .../Simple.Data.Ado.Test}/ProviderTest.cs | 0 .../Simple.Data.Ado.Test.csproj | 0 .../TableCollectionTest.cs | 0 .../TestCustomInserter.cs | 0 .../TestProviderAssemblyAttribute.cs | 0 .../Simple.Data.Ado.Test}/packages.config | 0 .../AdoAdapter.IAdapterWithFunctions.cs | 0 .../AdoAdapter.IAdapterWithRelation.cs | 0 .../AdoAdapter.IAdapterWithTransactions.cs | 0 .../Simple.Data.Ado}/AdoAdapter.cs | 0 .../Simple.Data.Ado}/AdoAdapterException.cs | 0 .../Simple.Data.Ado}/AdoAdapterFinder.cs | 0 .../Simple.Data.Ado}/AdoAdapterGetter.cs | 0 .../Simple.Data.Ado}/AdoAdapterInserter.cs | 0 .../Simple.Data.Ado}/AdoAdapterQueryRunner.cs | 0 .../AdoAdapterRelatedFinder.cs | 0 .../Simple.Data.Ado}/AdoAdapterTransaction.cs | 0 .../Simple.Data.Ado}/AdoAdapterUpserter.cs | 0 .../Simple.Data.Ado}/AdoOptions.cs | 0 .../Simple.Data.Ado}/BulkInserter.cs | 0 .../Simple.Data.Ado}/BulkInserterHelper.cs | 0 .../BulkInserterTransactionHelper.cs | 0 .../Simple.Data.Ado}/BulkUpdater.cs | 0 .../Simple.Data.Ado}/CollectionGraphNode.cs | 0 .../Simple.Data.Ado}/CommandBuilder.cs | 0 .../Simple.Data.Ado}/CommandHelper.cs | 0 .../Simple.Data.Ado}/CommandTemplate.cs | 0 .../Simple.Data.Ado}/ConnectionEx.cs | 0 .../Simple.Data.Ado}/ConnectionScope.cs | 0 .../DataParameterCollectionEx.cs | 0 .../Simple.Data.Ado}/DataReaderEnumerable.cs | 0 .../Simple.Data.Ado}/DataReaderExtensions.cs | 0 .../DataReaderMultipleEnumerator.cs | 0 .../Simple.Data.Ado}/DataRecordExtensions.cs | 0 .../Simple.Data.Ado}/DatabaseObservable.cs | 0 .../Simple.Data.Ado}/DbCommandExtensions.cs | 0 .../Simple.Data.Ado}/DbConnectionEx.cs | 0 .../DbConnectionExtensions.cs | 0 .../DelegatingConnectionBase1.cs | 0 .../Simple.Data.Ado}/DeleteExecutor.cs | 0 .../Simple.Data.Ado}/DeleteHelper.cs | 0 .../Simple.Data.Ado}/DictionaryExtensions.cs | 0 .../EagerLoadingEnumerable.cs | 0 .../Simple.Data.Ado}/EventHandlerEx.cs | 0 .../Simple.Data.Ado}/ExecutorFactory.cs | 0 .../Simple.Data.Ado}/ExpressionFormatter.cs | 0 .../ExpressionFormatterBase.cs | 0 .../Simple.Data.Ado}/ExpressionHasher.cs | 0 .../Simple.Data.Ado}/FindHelper.cs | 0 .../Simple.Data.Ado}/FunctionExecutor.cs | 0 .../Simple.Data.Ado}/FunctionNameConverter.cs | 0 .../GenericDbParameterFactory.cs | 0 .../Simple.Data.Ado}/GetExecutor.cs | 0 .../Simple.Data.Ado}/GraphMap.cs | 0 .../Simple.Data.Ado}/GraphNode.cs | 0 .../HomogenizedDictionaryIndex.cs | 0 .../HomogenizedKeyDictionary.cs | 0 .../Simple.Data.Ado}/IBulkInserter.cs | 0 .../Simple.Data.Ado}/IBulkUpdater.cs | 0 .../Simple.Data.Ado}/ICommandBuilder.cs | 0 .../Simple.Data.Ado}/IConnectionProvider.cs | 0 .../Simple.Data.Ado}/ICustomInserter.cs | 0 .../Simple.Data.Ado}/ICustomQueryBuilder.cs | 0 .../Simple.Data.Ado}/IDbParameterFactory.cs | 0 .../Simple.Data.Ado}/IExpressionFormatter.cs | 0 .../IFunctionNameConverter.cs | 0 .../IObservableQueryRunner.cs | 0 .../Simple.Data.Ado}/IQueryPager.cs | 0 .../Simple.Data.Ado}/ISchemaGetter.cs | 0 .../Simple.Data.Ado}/ISqlOptimizer.cs | 0 .../Simple.Data.Ado}/InsertExecutor.cs | 0 .../Simple.Data.Ado}/Joiner.cs | 0 .../Simple.Data.Ado}/ListExtensions.cs | 0 .../Simple.Data.Ado}/NugetPack.cmd | 0 .../Simple.Data.Ado}/NugetPush.cmd | 0 .../Simple.Data.Ado}/ObjectName.cs | 0 .../Simple.Data.Ado}/OptimizedDictionary.cs | 0 .../Simple.Data.Ado}/OptimizedDictionary2.cs | 0 .../OptimizedDictionaryIndex.cs | 0 .../Simple.Data.Ado}/ParameterTemplate.cs | 0 .../Simple.Data.Ado}/ProcedureExecutor.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../Properties/Settings.Designer.cs | 70 +- .../Properties/Settings.settings | 0 .../ProviderAssemblyAttributeBase.cs | 0 .../Simple.Data.Ado}/ProviderHelper.cs | 0 .../Simple.Data.Ado}/QueryBuilder.cs | 0 .../Simple.Data.Ado}/QueryBuilderBase.cs | 0 .../Simple.Data.Ado}/QueryExecutor.cs | 0 .../Schema/AmbiguousObjectNameException.cs | 0 .../Simple.Data.Ado}/Schema/Column.cs | 0 .../Schema/ColumnCollection.cs | 0 .../Simple.Data.Ado}/Schema/DatabaseSchema.cs | 0 .../Simple.Data.Ado}/Schema/ForeignKey.cs | 0 .../Schema/ForeignKeyCollection.cs | 0 .../Schema/ISchemaProvider.cs | 0 .../Simple.Data.Ado}/Schema/Key.cs | 0 .../Simple.Data.Ado}/Schema/Parameter.cs | 0 .../Simple.Data.Ado}/Schema/Procedure.cs | 0 .../Schema/ProcedureCollection.cs | 0 .../Simple.Data.Ado}/Schema/Table.cs | 0 .../Schema/TableCollection.cs | 0 .../Simple.Data.Ado}/Schema/TableJoin.cs | 0 .../Simple.Data.Ado}/Schema/TableType.cs | 0 .../SchemaResolutionException.cs | 0 .../Simple.Data.Ado}/Simple.Data.Ado.csproj | 0 .../Simple.Data.Ado}/Simple.Data.Ado.nuspec | 0 .../SimpleReferenceFormatter.cs | 0 .../Simple.Data.Ado}/SingleRecordGraphNode.cs | 0 .../Simple.Data.Ado}/SubDictionary.cs | 0 .../Simple.Data.Ado}/TraceHelper.cs | 0 .../Simple.Data.Ado}/TupleExtensions.cs | 0 .../Simple.Data.Ado}/TypeHelper.cs | 0 .../UpdateByCriteriaExecutor.cs | 0 .../Simple.Data.Ado}/UpdateEntityExecutor.cs | 0 .../Simple.Data.Ado}/UpdateHelper.cs | 0 .../Simple.Data.Ado}/app.config | 30 +- .../AmbiguousForeignKeyTest.cs | 0 .../Simple.Data.BehaviourTest}/App.config | 28 +- .../BulkInsertTest.cs | 0 .../DatabaseIntegrationContext.cs | 0 .../Simple.Data.BehaviourTest}/DeleteTest.cs | 0 .../ExceptionsTesting.cs | 0 .../Simple.Data.BehaviourTest}/FindTest.cs | 0 .../GetCountTest.cs | 0 .../Simple.Data.BehaviourTest}/GetTest.cs | 0 .../Simple.Data.BehaviourTest}/InsertTest.cs | 0 .../NameResolutionTests.cs | 0 .../NaturalJoinTest.cs | 0 .../NaturalNamingTest.cs | 0 .../ProcedureTest.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../Query/DistinctTest.cs | 0 .../Query/ExplicitJoinTest.cs | 0 .../Query/FunctionTest.cs | 0 .../Query/HavingTest.cs | 0 .../Query/QueryTest.cs | 0 .../Query/WhereTest.cs | 0 .../Query/WithCountTest.cs | 0 .../Query/WithTest.cs | 0 .../RangeAndArrayFindTest.cs | 0 .../SchemaHelper.cs | 0 .../SchemaQualifiedTableTest.cs | 0 .../Simple.Data.BehaviourTest.csproj | 0 .../StopUsingMockTest.cs | 0 .../TestTraceListener.cs | 0 .../TraceSettingsTest.cs | 0 .../TransactionTest.cs | 0 .../Simple.Data.BehaviourTest}/UpdateTest.cs | 0 .../Simple.Data.BehaviourTest}/User.cs | 0 .../packages.config | 0 .../Simple.Data.GraphTest}/App.config | 0 .../Simple.Data.GraphTest}/Graph.mdf | Bin .../Simple.Data.GraphTest}/GraphLoadTest.cs | 0 .../Simple.Data.GraphTest}/Graph_log.ldf | Bin .../Simple.Data.GraphTest}/Models/Customer.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../Simple.Data.GraphTest.csproj | 0 .../Simple.Data.GraphTest}/packages.config | 0 .../CanAssignArray.cs | 0 .../InMemoryTests.cs | 0 .../NameResolutionTest.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../Simple.Data.InMemoryTest.csproj | 0 .../SimpleQueryConversionTests.cs | 0 .../Simple.Data.InMemoryTest}/packages.config | 0 .../Simple.Data.Migrations.Tests}/Class1.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../Simple.Data.Migrations.Tests.csproj | 0 .../packages.config | 0 .../Simple.Data.Migrations}/Class1.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../Simple.Data.Migrations.csproj | 0 .../MockConnectionSchemaTest.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../Simple.Data.Mocking.Test.csproj | 160 +- .../XmlMockAdapterTest.cs | 0 .../Simple.Data.Mocking.Test}/packages.config | 0 .../Ado/DataRowExtensions.cs | 0 .../Ado/DataTableExtensions.cs | 0 .../Ado/MockConnectionProvider.cs | 0 .../Ado/MockDataParameter.cs | 0 .../Ado/MockDataParameterCollection.cs | 0 .../Ado/MockDataReader.cs | 0 .../Ado/MockDataRecord.cs | 0 .../Simple.Data.Mocking}/Ado/MockDatabase.cs | 0 .../Simple.Data.Mocking}/Ado/MockDbCommand.cs | 0 .../Ado/MockDbConnection.cs | 0 .../Ado/MockDbTransaction.cs | 0 .../Ado/MockSchemaProvider.cs | 0 .../Simple.Data.Mocking}/MockHelper.cs | 0 .../Simple.Data.Mocking}/NugetPack.cmd | 0 .../Simple.Data.Mocking}/NugetPush.cmd | 0 .../Properties/AssemblyInfo.cs | 0 .../Simple.Data.Mocking.csproj | 194 +- .../Simple.Data.Mocking.nuspec | 0 .../XElementExtensions.cs | 0 .../Simple.Data.Mocking}/XmlMockAdapter.cs | 390 +- .../XmlPredicateBuilder.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../Properties/Resources.Designer.cs | 0 .../Properties/Resources.resx | 0 .../Resources/ForeignKeysSql.txt | 0 .../Resources/PrimaryKeysSql.txt | 0 .../Simple.Data.SqlCe35.csproj | 0 .../SqlCe35ConnectionProvider.cs | 0 .../SqlCe35SchemaProvider.cs | 0 .../Simple.Data.SqlCe35}/app.config | 0 .../Simple.Data.SqlCe35Test}/FindTests.cs | 0 .../OrderDetailTests.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../SchemaTests/DatabaseSchemaTests.cs | 0 .../Simple.Data.SqlCe35Test.csproj | 0 .../Simple.Data.SqlCe35Test}/TestDatabase.sdf | Bin .../Simple.Data.SqlCe35Test}/User.cs | 0 .../Simple.Data.SqlCe35Test}/packages.config | 0 .../Simple.Data.SqlCe40}/DbTypeLookup.cs | 0 .../Simple.Data.SqlCe40}/NugetPack.cmd | 0 .../Simple.Data.SqlCe40}/NugetPush.cmd | 0 .../Properties/AssemblyInfo.cs | 0 .../Properties/Resources.Designer.cs | 180 +- .../Properties/Resources.resources | Bin .../Properties/Resources.resx | 0 .../Resources/ForeignKeysSql.txt | 0 .../Resources/PrimaryKeysSql.txt | 0 .../Simple.Data.SqlCe40.csproj | 210 +- .../Simple.Data.SqlCe40.nuspec | 0 .../SqlCe40ConnectionProvider.cs | 0 .../SqlCe40ProviderAttribute.cs | 0 .../Simple.Data.SqlCe40}/SqlCe40QueryPager.cs | 0 .../SqlCe40SchemaProvider.cs | 0 .../Simple.Data.SqlCe40}/SqlCeColumn.cs | 0 .../SqlCeDbParameterFactory.cs | 0 .../Simple.Data.SqlCe40}/SqlTypeResolver.cs | 0 .../Simple.Data.SqlCe40}/packages.config | 6 +- .../ConnectionProviderTest.cs | 0 .../Simple.Data.SqlCe40Test}/FindTests.cs | 0 .../Simple.Data.SqlCe40Test}/InsertTests.cs | 0 .../Simple.Data.SqlCe40Test}/Northwind.sdf | Bin .../NorthwindTests.cs | 0 .../OrderDetailTests.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../Simple.Data.SqlCe40Test}/QueryTest.cs | 0 .../SchemaProviderTest.cs | 0 .../SchemaTests/DatabaseSchemaTests.cs | 0 .../Simple.Data.SqlCe40Test}/Setup.cs | 0 .../Simple.Data.SqlCe40Test.csproj | 0 .../SqlCe40QueryPagerTest.cs | 0 .../Simple.Data.SqlCe40Test}/TestDatabase.sdf | Bin .../Simple.Data.SqlCe40Test}/User.cs | 0 .../Simple.Data.SqlCe40Test}/packages.config | 0 .../Simple.Data.SqlServer}/DbTypeLookup.cs | 0 .../Simple.Data.SqlServer}/NugetPack.cmd | 0 .../Simple.Data.SqlServer}/NugetPush.cmd | 0 .../Properties/AssemblyInfo.cs | 0 .../Properties/Resources.Designer.cs | 188 +- .../Properties/Resources.resources | Bin .../Properties/Resources.resx | 0 .../Resources/ForeignKeysSql.txt | 0 .../Resources/PrimaryKeySql.txt | 0 .../Simple.Data.SqlServer.csproj | 220 +- .../Simple.Data.SqlServer.nuspec | 0 .../Simple.Data.SqlServer}/SqlBulkInserter.cs | 0 .../Simple.Data.SqlServer}/SqlColumn.cs | 0 .../SqlCommandOptimizer.cs | 0 .../SqlConnectionProvider.cs | 0 .../SqlCustomInserter.cs | 0 .../SqlCustomQueryBuilder.cs | 0 .../SqlDbParameterFactory.cs | 0 .../Simple.Data.SqlServer}/SqlDbTypeEx.cs | 0 .../SqlObservableQueryRunner.cs | 0 .../Simple.Data.SqlServer}/SqlQueryBuilder.cs | 0 .../Simple.Data.SqlServer}/SqlQueryPager.cs | 0 .../SqlSchemaProvider.cs | 0 .../SqlServerProviderAttribute.cs | 0 .../Simple.Data.SqlServer}/SqlTypeResolver.cs | 0 .../Simple.Data.SqlTest}/BulkInsertTest.cs | 0 .../Simple.Data.SqlTest}/ConversionTests.cs | 0 .../Simple.Data.SqlTest}/DatabaseHelper.cs | 0 .../DatabaseOpenerTests.cs | 0 .../Simple.Data.SqlTest}/DbImage.cs | 0 .../Simple.Data.SqlTest}/DeleteTest.cs | 0 .../Simple.Data.SqlTest}/EnumTest.cs | 0 .../Simple.Data.SqlTest}/FindTests.cs | 0 .../Simple.Data.SqlTest}/FunctionTest.cs | 0 .../Simple.Data.SqlTest}/GetTests.cs | 0 .../Simple.Data.SqlTest}/InsertTests.cs | 0 .../Simple.Data.SqlTest}/NaturalJoinTest.cs | 0 .../Simple.Data.SqlTest}/OrderDetailTests.cs | 0 .../Simple.Data.SqlTest}/ProcedureTest.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../Properties/Resources.Designer.cs | 144 +- .../Properties/Resources.resources | Bin .../Properties/Resources.resx | 0 .../Properties/Settings.Designer.cs | 74 +- .../Properties/Settings.settings | 26 +- .../Simple.Data.SqlTest}/QueryTest.cs | 0 .../Resources/DatabaseReset.txt | 0 .../Resources/GetImage.cs | 0 .../Simple.Data.SqlTest}/Resources/test.png | Bin .../SchemaQualifiedTests.cs | 0 .../SchemaTests/DataTypeTests.cs | 0 .../SchemaTests/DatabaseSchemaTests.cs | 0 .../Simple.Data.SqlTest}/SetupFixture.cs | 76 +- .../Simple.Data.SqlTest.csproj | 0 .../Simple.Data.SqlTest}/SimpleTest.mdf | Bin .../Simple.Data.SqlTest}/SimpleTest_log.ldf | Bin .../Simple.Data.SqlTest}/SqlQueryPagerTest.cs | 0 .../Simple.Data.SqlTest}/TestTraceListener.cs | 0 .../Simple.Data.SqlTest}/TransactionTests.cs | 0 .../Simple.Data.SqlTest}/UpdateTests.cs | 0 .../Simple.Data.SqlTest}/UpsertTests.cs | 0 .../Simple.Data.SqlTest}/User.cs | 0 .../Simple.Data.SqlTest}/WeirdTypeTest.cs | 0 .../Simple.Data.SqlTest}/app.config | 18 +- .../Simple.Data.SqlTest}/packages.config | 0 .../DatabaseInternalsEx.cs | 0 .../DatabaseSchemaTestsBase.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../Simple.Data.TestHelper.csproj | 0 .../Simple.Data.TestHelper}/packages.config | 0 .../AdapterFactoryTest.cs | 0 ...BeginTransactionWithIsolataionLevelTest.cs | 0 .../Simple.Data.UnitTest}/BinderHelperTest.cs | 0 .../CheckedEnumerableTest.cs | 0 .../Simple.Data.UnitTest}/ComposerTest.cs | 0 .../ConcreteCollectionTypeCreatorTest.cs | 0 .../ConcreteTypeCreatorTest.cs | 0 .../DatabaseOpenerTest.cs | 0 .../DictionaryClonerTest.cs | 0 .../DictionaryQueryRunnerTest.cs | 0 .../DynamicEnumerableTest.cs | 0 .../DynamicRecordTest.cs | 0 .../DynamicReferenceTest.cs | 0 .../DynamicStringExtensionsTest.cs | 0 .../Simple.Data.UnitTest}/DynamicTableTest.cs | 0 .../EagerLoadingEnumerableTest.cs | 0 .../ExpressionHelperTest.cs | 0 .../GroupingHandlerTest.cs | 0 .../Simple.Data.UnitTest}/ListHelper.cs | 0 .../MathReferenceTest.cs | 0 .../Simple.Data.UnitTest}/MaybeTest.cs | 0 .../MethodNameParserTest.cs | 0 .../ObjectReferenceTest.cs | 0 .../PluralizationTest.cs | 0 .../Simple.Data.UnitTest}/PromiseTest.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../PropertySetterBuilderTest.cs | 0 .../Simple.Data.UnitTest}/RangeTest.cs | 0 .../Simple.Data.UnitTest.csproj | 0 .../SimpleDataExceptionTest.cs | 0 .../SimpleExpressionTest.cs | 0 .../SimpleListAsListTest.cs | 0 .../Simple.Data.UnitTest}/SimpleListTest.cs | 0 .../Simple.Data.UnitTest}/SimpleQueryTest.cs | 0 .../SimpleRecordAsDictionaryTest.cs | 0 .../SimpleRecordCloneTest.cs | 0 .../SimpleRecordConvertTest.cs | 0 .../SimpleResultSetTest.cs | 0 .../SpecialReferenceTests.cs | 0 .../StringExtensionsTest.cs | 0 .../UnresolvableObjectExceptionTest.cs | 0 .../Simple.Data.UnitTest}/packages.config | 0 Simple.Data.sln => src/Simple.Data.sln | 0 .../Simple.Data.userprefs | 0 Simple.Data.vsmdi => src/Simple.Data.vsmdi | 0 .../Simple.Data}/ActionDisposable.cs | 0 {Simple.Data => src/Simple.Data}/Adapter.cs | 0 .../Simple.Data}/AdapterException.cs | 0 .../Simple.Data}/AdapterFactory.cs | 0 .../Simple.Data}/AdapterHelper.cs | 0 .../AdapterMethodDynamicInvoker.cs | 0 .../AdapterWithFunctionsExtensions.cs | 0 .../Simple.Data}/AdoCompatibleComparer.cs | 0 .../AllColumnsSpecialReference.cs | 0 {Simple.Data => src/Simple.Data}/Argument.cs | 0 .../Simple.Data}/ArgumentCollection.cs | 0 .../Simple.Data}/AssemblyEx.cs | 0 .../Simple.Data}/BadExpressionException.cs | 0 .../Simple.Data}/BinderHelper.cs | 0 .../Simple.Data}/CachingAdapterFactory.cs | 0 .../Simple.Data}/CastEnumerable.cs | 0 .../Simple.Data}/CheckedEnumerable.cs | 0 {Simple.Data => src/Simple.Data}/Command.cs | 0 .../Simple.Data}/CommandResult.cs | 0 .../Simple.Data}/Commands/AllCommand.cs | 0 .../Simple.Data}/Commands/ArgumentHelper.cs | 100 +- .../Simple.Data}/Commands/CommandFactory.cs | 0 .../Simple.Data}/Commands/DeleteAllCommand.cs | 0 .../Simple.Data}/Commands/DeleteByCommand.cs | 0 .../Commands/ExecuteFunctionCommand.cs | 0 .../Simple.Data}/Commands/ExistsByCommand.cs | 0 .../Simple.Data}/Commands/ExistsCommand.cs | 0 .../Simple.Data}/Commands/FindAllByCommand.cs | 0 .../Simple.Data}/Commands/FindAllCommand.cs | 0 .../Simple.Data}/Commands/FindByCommand.cs | 0 .../Simple.Data}/Commands/FindCommand.cs | 0 .../Simple.Data}/Commands/GetCommand.cs | 0 .../Commands/GetCountByCommand.cs | 0 .../Simple.Data}/Commands/GetCountCommand.cs | 0 .../Simple.Data}/Commands/ICommand.cs | 0 .../Simple.Data}/Commands/InsertCommand.cs | 0 .../Simple.Data}/Commands/QueryByCommand.cs | 0 .../Simple.Data}/Commands/QueryCommand.cs | 0 .../Simple.Data}/Commands/ResultHelper.cs | 0 .../Simple.Data}/Commands/UpdateAllCommand.cs | 0 .../Simple.Data}/Commands/UpdateByCommand.cs | 0 .../Simple.Data}/Commands/UpdateCommand.cs | 0 .../Simple.Data}/Commands/UpsertByCommand.cs | 0 .../Simple.Data}/Commands/UpsertCommand.cs | 0 .../Simple.Data}/CommonTypes.cs | 0 {Simple.Data => src/Simple.Data}/Composer.cs | 0 .../ConcreteCollectionTypeCreator.cs | 0 .../Simple.Data}/ConcreteObject.cs | 0 .../Simple.Data}/ConcreteTypeCreator.cs | 0 .../Simple.Data}/CountSpecialReference.cs | 0 .../Simple.Data}/DataResult.cs | 0 .../Simple.Data}/DataStrategy.cs | 0 .../Simple.Data}/DataStrategyWithOptions.cs | 0 .../Simple.Data}/Database.Open.cs | 0 {Simple.Data => src/Simple.Data}/Database.cs | 0 .../Simple.Data}/DatabaseOpener.cs | 0 .../Simple.Data}/DatabaseOpenerMethods.cs | 0 .../Simple.Data}/DatabaseRunner.cs | 0 .../Simple.Data}/DictionaryCloner.cs | 0 .../Simple.Data}/DistinctClause.cs | 0 .../Simple.Data}/DynamicSchema.cs | 0 .../Simple.Data}/DynamicTable.cs | 0 .../Simple.Data}/EnumerableEx.cs | 100 +- .../Simple.Data}/ErrorCallback.cs | 0 .../Simple.Data}/ExistsSpecialReference.cs | 0 .../Simple.Data}/ExpressionHelper.cs | 0 .../Extensions/ArrayExtensions.cs | 0 .../Extensions/BinderExtensions.cs | 0 .../Extensions/DynamicStringExtensions.cs | 0 .../Extensions/EnumerableExtensions.cs | 0 .../Simple.Data}/Extensions/HomogenizeEx.cs | 0 .../Extensions/IDictionaryExtensions.cs | 0 .../Simple.Data}/Extensions/ObjectEx.cs | 160 +- .../Extensions/ResultSetExtensions.cs | 0 .../Extensions/StringExtensions.cs | 0 .../Simple.Data}/ForUpdateClause.cs | 0 .../Simple.Data}/FunctionReference.cs | 0 .../Simple.Data}/FunctionReturnType.cs | 0 .../Simple.Data}/FunctionSignature.cs | 0 {Simple.Data => src/Simple.Data}/Future1.cs | 0 .../Simple.Data}/HavingClause.cs | 0 .../HomogenizedEqualityComparer.cs | 0 .../Simple.Data}/IAdapterFactory.cs | 0 .../Simple.Data}/IAdapterTransaction.cs | 0 .../Simple.Data}/IAdapterWithRelation.cs | 0 .../Simple.Data}/IAdapterWithTransactions.cs | 0 {Simple.Data => src/Simple.Data}/IDatabase.cs | 0 .../Simple.Data}/IDatabaseOpener.cs | 0 .../Simple.Data}/IPluralizer.cs | 0 {Simple.Data => src/Simple.Data}/IRange.cs | 0 .../Simple.Data}/InMemoryAdapter.cs | 0 .../InMemoryAdapterIAdapterWithRelation.cs | 0 ...InMemoryAdapterIAdapterWithTransactions.cs | 0 .../Simple.Data}/JoinClause.cs | 0 {Simple.Data => src/Simple.Data}/JoinType.cs | 0 .../Simple.Data}/MathReference.cs | 0 {Simple.Data => src/Simple.Data}/Maybe.cs | 0 {Simple.Data => src/Simple.Data}/MefHelper.cs | 0 .../Simple.Data}/MethodNameParser.cs | 154 +- .../Simple.Data}/MultiDataResult.cs | 0 .../Simple.Data}/NugetPack.cmd | 0 .../Simple.Data}/NugetPush.cmd | 0 .../Simple.Data}/ObjectReference.cs | 0 .../Simple.Data}/OfTypeEnumerable.cs | 0 .../Simple.Data}/OperationResult.cs | 0 .../Operations/DeleteOperation.cs | 0 .../Simple.Data}/Operations/GetOperation.cs | 0 .../Operations/InsertOperation.cs | 0 .../Simple.Data}/Operations/Operation.cs | 12 +- .../Simple.Data}/Operations/QueryOperation.cs | 0 .../Operations/UpdateByCriteriaOperation.cs | 0 .../Operations/UpdateEntityOperation.cs | 0 .../Operations/UpsertOperation.cs | 0 .../Simple.Data}/OptionsBase.cs | 0 .../Simple.Data}/OrderByClause.cs | 0 .../Simple.Data}/OrderByDirection.cs | 0 {Simple.Data => src/Simple.Data}/Promise.cs | 0 .../Simple.Data}/Properties/AssemblyInfo.cs | 0 .../Properties/Resources.resources | Bin .../Simple.Data}/PropertySetterBuilder.cs | 742 +- .../QueryPolyfills/AggregateValueResolver.cs | 0 .../DictionaryCreatorFactory.cs | 0 .../DictionaryEqualityComparer.cs | 0 .../QueryPolyfills/DictionaryQueryRunner.cs | 0 .../QueryPolyfills/FunctionHandlers.cs | 0 .../QueryPolyfills/FunctionValueResolver.cs | 0 .../QueryPolyfills/GroupingHandler.cs | 0 .../QueryPolyfills/ObjectMaths.cs | 0 .../QueryPolyfills/ObjectValueResolver.cs | 0 .../QueryPolyfills/OrderByClauseHandler.cs | 0 .../QueryPolyfills/SelectClauseHandler.cs | 0 .../QueryPolyfills/ValueResolver.cs | 0 .../QueryPolyfills/WhereClauseHandler.cs | 426 +- .../Simple.Data}/QueryResult.cs | 0 {Simple.Data => src/Simple.Data}/Range.cs | 0 {Simple.Data => src/Simple.Data}/Range1.cs | 0 .../Simple.Data}/RunStrategy.cs | 0 .../Simple.Data}/SelectClause.cs | 0 .../Simple.Data}/Simple.Data.csproj | 0 .../Simple.Data}/Simple.Data.dll.config | 0 .../Simple.Data}/Simple.Data.nuspec | 0 .../SimpleDataConfigurationSection.cs | 0 .../Simple.Data}/SimpleDataException.cs | 0 .../Simple.Data}/SimpleDataTraceSources.cs | 0 .../Simple.Data}/SimpleEmptyExpression.cs | 0 .../Simple.Data}/SimpleExpression.cs | 0 .../Simple.Data}/SimpleExpressionType.cs | 0 .../Simple.Data}/SimpleFunction.cs | 0 .../Simple.Data}/SimpleList.cs | 0 .../Simple.Data}/SimpleObservable.cs | 0 .../Simple.Data}/SimpleOrderByItem.cs | 0 .../Simple.Data}/SimpleQuery.cs | 0 .../Simple.Data}/SimpleQueryClauseBase.cs | 0 .../Simple.Data}/SimpleRecord.Dictionary2.cs | 0 .../Simple.Data}/SimpleRecord.cs | 0 .../Simple.Data}/SimpleReference.cs | 0 .../Simple.Data}/SimpleResultSet.cs | 0 .../Simple.Data}/SimpleTransaction.cs | 0 .../Simple.Data}/SkipClause.cs | 0 .../Simple.Data}/SpecialReference.cs | 0 .../Simple.Data}/TakeClause.cs | 0 .../Simple.Data}/TransactionRunner.cs | 0 .../Simple.Data}/TypeExtensions.cs | 0 .../UnresolvableObjectException.cs | 0 .../Simple.Data}/WhereClause.cs | 0 .../Simple.Data}/WithClause.cs | 0 .../Simple.Data}/WithCountClause.cs | 0 {Simple.Data => src/Simple.Data}/WithMode.cs | 0 {Simple.Data => src/Simple.Data}/WithType.cs | 0 {Simple.Data => src/Simple.Data}/app.config | 18 +- Simple_Data.ndproj => src/Simple_Data.ndproj | 0 .../packages}/NUnit.2.5.10.11092/Logo.ico | Bin .../NUnit.2.5.10.11092.nuspec | 24 +- .../NUnit.2.5.10.11092/NUnitFitTests.html | 0 .../NUnit.2.5.10.11092/fit-license.txt | 0 .../lib/nunit.framework.xml | 0 .../packages}/NUnit.2.5.10.11092/license.txt | 0 .../tools/NUnitTests.VisualState.xml | 0 .../tools/NUnitTests.config | 0 .../NUnit.2.5.10.11092/tools/NUnitTests.nunit | 0 .../NUnit.2.5.10.11092/tools/TestResult.xml | 0 .../NUnit.2.5.10.11092/tools/agent.conf | 0 .../NUnit.2.5.10.11092/tools/agent.log.conf | 0 .../tools/launcher.log.conf | 0 .../NUnit.2.5.10.11092/tools/lib/Failure.png | Bin .../NUnit.2.5.10.11092/tools/lib/Ignored.png | Bin .../tools/lib/Inconclusive.png | Bin .../NUnit.2.5.10.11092/tools/lib/Skipped.png | Bin .../NUnit.2.5.10.11092/tools/lib/Success.png | Bin .../tools/nunit-agent-x86.exe.config | 0 .../tools/nunit-agent.exe.config | 0 .../tools/nunit-console-x86.exe.config | 0 .../tools/nunit-console.exe.config | 0 .../tools/nunit-x86.exe.config | 0 .../NUnit.2.5.10.11092/tools/nunit.exe.config | 0 .../tools/pnunit-agent.exe.config | 0 .../tools/pnunit-launcher.exe.config | 0 .../tools/runFile.exe.config | 0 .../NUnit.2.5.10.11092/tools/runpnunit.bat | 0 .../NUnit.2.5.10.11092/tools/test.conf | 0 .../packages}/NUnit.2.5.9.10348/Logo.ico | Bin .../NUnit.2.5.9.10348.nuspec | 24 +- .../NUnit.2.5.9.10348/NUnitFitTests.html | 0 .../Tools/NUnitFitTests.html | 0 .../NUnit.2.5.9.10348/Tools/NUnitTests.config | 0 .../NUnit.2.5.9.10348/Tools/NUnitTests.nunit | 0 .../NUnit.2.5.9.10348/Tools/agent.conf | 0 .../NUnit.2.5.9.10348/Tools/agent.log.conf | 0 .../NUnit.2.5.9.10348/Tools/launcher.log.conf | 0 .../NUnit.2.5.9.10348/Tools/lib/Failure.png | Bin .../NUnit.2.5.9.10348/Tools/lib/Ignored.png | Bin .../Tools/lib/Inconclusive.png | Bin .../NUnit.2.5.9.10348/Tools/lib/Skipped.png | Bin .../NUnit.2.5.9.10348/Tools/lib/Success.png | Bin .../Tools/nunit-agent-x86.exe.config | 0 .../Tools/nunit-agent.exe.config | 0 .../Tools/nunit-console-x86.exe.config | 0 .../Tools/nunit-console.exe.config | 0 .../Tools/nunit-x86.exe.config | 0 .../NUnit.2.5.9.10348/Tools/nunit.exe.config | 0 .../Tools/pnunit-agent.exe.config | 0 .../Tools/pnunit-launcher.exe.config | 0 .../Tools/runFile.exe.config | 0 .../NUnit.2.5.9.10348/Tools/runpnunit.bat | 0 .../NUnit.2.5.9.10348/Tools/test.conf | 0 .../NUnit.2.5.9.10348/fit-license.txt | 0 .../NUnit.2.5.9.10348/lib/nunit.framework.xml | 20770 ++++++++-------- .../packages}/NUnit.2.5.9.10348/license.txt | 0 .../packages}/NUnit.2.6.3/NUnit.2.6.3.nuspec | 0 .../NUnit.2.6.3/lib/nunit.framework.xml | 0 .../packages}/NUnit.2.6.3/license.txt | 0 .../Simple.Data.Ado.0.6.1.nuspec | 38 +- .../Simple.Data.Core.0.6.1.nuspec | 32 +- .../Simple.Data.SqlCompact40.0.6.1.nuspec | 38 +- .../Content/web.config.transform | 0 .../Microsoft.VC90.CRT.manifest | 10 +- .../amd64/Microsoft.VC90.CRT/README_ENU.txt | Bin .../Microsoft.VC90.CRT.manifest | 10 +- .../x86/Microsoft.VC90.CRT/README_ENU.txt | Bin .../SQLCE_EULA_ENU.rtf | 0 .../SqlServerCompact.4.0.8482.1.nuspec | 26 +- .../Tools/GetSqlCEPostBuildCmd.ps1 | 22 +- .../Tools/install.ps1 | 0 .../Tools/uninstall.ps1 | 0 .../Trespasser.1.1/Trespasser.1.1.nuspec | 30 +- .../packages}/repositories.config | 0 713 files changed, 12797 insertions(+), 12814 deletions(-) delete mode 100644 Assemblies/Microsoft.SqlServer.Types.dll delete mode 100644 Assemblies/System.Data.SqlServerCe.dll delete mode 100644 Assemblies/sqlceca35.dll delete mode 100644 Assemblies/sqlcecompact35.dll delete mode 100644 Assemblies/sqlceer35EN.dll delete mode 100644 Assemblies/sqlceme35.dll delete mode 100644 Assemblies/sqlceoledb35.dll delete mode 100644 Assemblies/sqlceqp35.dll delete mode 100644 Assemblies/sqlcese35.dll delete mode 100644 Simple.Data.SqlCe35/sqlceca35.dll delete mode 100644 Simple.Data.SqlCe35/sqlcecompact35.dll delete mode 100644 Simple.Data.SqlCe35/sqlceer35EN.dll delete mode 100644 Simple.Data.SqlCe35/sqlceme35.dll delete mode 100644 Simple.Data.SqlCe35/sqlceoledb35.dll delete mode 100644 Simple.Data.SqlCe35/sqlceqp35.dll delete mode 100644 Simple.Data.SqlCe35/sqlcese35.dll delete mode 100644 Simple.Data.SqlCe35Test/sqlceca35.dll delete mode 100644 Simple.Data.SqlCe35Test/sqlcecompact35.dll delete mode 100644 Simple.Data.SqlCe35Test/sqlceer35EN.dll delete mode 100644 Simple.Data.SqlCe35Test/sqlceme35.dll delete mode 100644 Simple.Data.SqlCe35Test/sqlceoledb35.dll delete mode 100644 Simple.Data.SqlCe35Test/sqlceqp35.dll delete mode 100644 Simple.Data.SqlCe35Test/sqlcese35.dll delete mode 100644 Simple.Data.SqlCe40Test/TestDatabase.sdf.bak delete mode 100644 Simple.Data.sln.DotSettings delete mode 100644 Simple.Data/Simple.Data.csproj.vspscc delete mode 100644 packages/NUnit.2.5.10.11092/lib/nunit.framework.dll delete mode 100644 packages/NUnit.2.5.10.11092/lib/nunit.mocks.dll delete mode 100644 packages/NUnit.2.5.10.11092/lib/pnunit.framework.dll delete mode 100644 packages/NUnit.2.5.10.11092/tools/lib/fit.dll delete mode 100644 packages/NUnit.2.5.10.11092/tools/lib/log4net.dll delete mode 100644 packages/NUnit.2.5.10.11092/tools/lib/nunit-console-runner.dll delete mode 100644 packages/NUnit.2.5.10.11092/tools/lib/nunit-gui-runner.dll delete mode 100644 packages/NUnit.2.5.10.11092/tools/lib/nunit.core.dll delete mode 100644 packages/NUnit.2.5.10.11092/tools/lib/nunit.core.interfaces.dll delete mode 100644 packages/NUnit.2.5.10.11092/tools/lib/nunit.fixtures.dll delete mode 100644 packages/NUnit.2.5.10.11092/tools/lib/nunit.uiexception.dll delete mode 100644 packages/NUnit.2.5.10.11092/tools/lib/nunit.uikit.dll delete mode 100644 packages/NUnit.2.5.10.11092/tools/lib/nunit.util.dll delete mode 100644 packages/NUnit.2.5.10.11092/tools/nunit-agent-x86.exe delete mode 100644 packages/NUnit.2.5.10.11092/tools/nunit-agent.exe delete mode 100644 packages/NUnit.2.5.10.11092/tools/nunit-console-x86.exe delete mode 100644 packages/NUnit.2.5.10.11092/tools/nunit-console.exe delete mode 100644 packages/NUnit.2.5.10.11092/tools/nunit-x86.exe delete mode 100644 packages/NUnit.2.5.10.11092/tools/nunit.exe delete mode 100644 packages/NUnit.2.5.10.11092/tools/nunit.framework.dll delete mode 100644 packages/NUnit.2.5.10.11092/tools/pnunit-agent.exe delete mode 100644 packages/NUnit.2.5.10.11092/tools/pnunit-launcher.exe delete mode 100644 packages/NUnit.2.5.10.11092/tools/pnunit.framework.dll delete mode 100644 packages/NUnit.2.5.10.11092/tools/pnunit.tests.dll delete mode 100644 packages/NUnit.2.5.10.11092/tools/runFile.exe delete mode 100644 packages/Simple.Data.Ado.0.6.1/lib/net40/Simple.Data.Ado.dll delete mode 100644 packages/Simple.Data.Core.0.6.1/lib/net40/Simple.Data.dll delete mode 100644 packages/Simple.Data.SqlCompact40.0.6.1/lib/net40/Simple.Data.SqlCe40.dll delete mode 100644 packages/SqlServerCompact.4.0.8482.1/NativeBinaries/amd64/sqlcecompact40.dll delete mode 100644 packages/SqlServerCompact.4.0.8482.1/NativeBinaries/amd64/sqlceer40EN.dll delete mode 100644 packages/SqlServerCompact.4.0.8482.1/NativeBinaries/amd64/sqlceme40.dll delete mode 100644 packages/SqlServerCompact.4.0.8482.1/NativeBinaries/amd64/sqlceqp40.dll delete mode 100644 packages/SqlServerCompact.4.0.8482.1/NativeBinaries/amd64/sqlcese40.dll delete mode 100644 packages/SqlServerCompact.4.0.8482.1/NativeBinaries/x86/sqlcecompact40.dll delete mode 100644 packages/SqlServerCompact.4.0.8482.1/NativeBinaries/x86/sqlceer40EN.dll delete mode 100644 packages/SqlServerCompact.4.0.8482.1/NativeBinaries/x86/sqlceme40.dll delete mode 100644 packages/SqlServerCompact.4.0.8482.1/NativeBinaries/x86/sqlceqp40.dll delete mode 100644 packages/SqlServerCompact.4.0.8482.1/NativeBinaries/x86/sqlcese40.dll delete mode 100644 packages/SqlServerCompact.4.0.8482.1/lib/System.Data.SqlServerCe.dll delete mode 100644 packages/Trespasser.1.1/lib/net40/Trespasser.dll rename AutoTest.config => src/AutoTest.config (100%) rename CommonAssemblyInfo.cs => src/CommonAssemblyInfo.cs (96%) rename PerformanceTestConsole.psess => src/PerformanceTestConsole.psess (100%) rename {PerformanceTestConsole => src/PerformanceTestConsole}/PerformanceTestConsole.csproj (97%) rename {PerformanceTestConsole => src/PerformanceTestConsole}/Program.cs (100%) rename {PerformanceTestConsole => src/PerformanceTestConsole}/Properties/AssemblyInfo.cs (100%) rename {PerformanceTestConsole => src/PerformanceTestConsole}/app.config (98%) rename {PerformanceTestConsole => src/PerformanceTestConsole}/packages.config (98%) rename PerformanceTestConsole111123.vsp => src/PerformanceTestConsole111123.vsp (100%) rename {ProfilingApp => src/ProfilingApp}/App.config (98%) rename {ProfilingApp => src/ProfilingApp}/CastTask.cs (100%) rename {ProfilingApp => src/ProfilingApp}/FindAllByTask.cs (100%) rename {ProfilingApp => src/ProfilingApp}/FindByTask.cs (100%) rename {ProfilingApp => src/ProfilingApp}/IProfileTask.cs (100%) rename {ProfilingApp => src/ProfilingApp}/ProfilingApp.csproj (97%) rename {ProfilingApp => src/ProfilingApp}/Program.cs (100%) rename {ProfilingApp => src/ProfilingApp}/Properties/AssemblyInfo.cs (100%) rename {ProfilingApp => src/ProfilingApp}/Properties/Resources.Designer.cs (97%) rename {ProfilingApp => src/ProfilingApp}/Properties/Resources.resx (100%) rename {ProfilingApp => src/ProfilingApp}/Properties/Settings.Designer.cs (97%) rename {ProfilingApp => src/ProfilingApp}/Properties/Settings.settings (100%) rename {ProfilingApp => src/ProfilingApp}/QueryWithCountTask.cs (100%) rename {ProfilingApp => src/ProfilingApp}/Resources/DatabaseResetSql.txt (100%) rename {Releases => src/Releases}/CopyReleases.cmd (100%) rename Simple.Data-Mono.sln => src/Simple.Data-Mono.sln (100%) rename Simple.Data-Mono.userprefs => src/Simple.Data-Mono.userprefs (100%) rename {Simple.Data.AdapterApi => src/Simple.Data.AdapterApi}/DatabaseHelper.cs (100%) rename {Simple.Data.AdapterApi => src/Simple.Data.AdapterApi}/Properties/AssemblyInfo.cs (100%) rename {Simple.Data.AdapterApi => src/Simple.Data.AdapterApi}/Simple.Data.AdapterApi.csproj (97%) rename {Simple.Data.Ado.Test => src/Simple.Data.Ado.Test}/AdoAdapterExceptionTest.cs (100%) rename {Simple.Data.Ado.Test => src/Simple.Data.Ado.Test}/ConnectionModifierTest.cs (100%) rename {Simple.Data.Ado.Test => src/Simple.Data.Ado.Test}/EagerLoadingEnumerableTest.cs (100%) rename {Simple.Data.Ado.Test => src/Simple.Data.Ado.Test}/GraphNodeTest.cs (100%) rename {Simple.Data.Ado.Test => src/Simple.Data.Ado.Test}/Properties/AssemblyInfo.cs (100%) rename {Simple.Data.Ado.Test => src/Simple.Data.Ado.Test}/ProviderHelperTest.cs (100%) rename {Simple.Data.Ado.Test => src/Simple.Data.Ado.Test}/ProviderTest.cs (100%) rename {Simple.Data.Ado.Test => src/Simple.Data.Ado.Test}/Simple.Data.Ado.Test.csproj (100%) rename {Simple.Data.Ado.Test => src/Simple.Data.Ado.Test}/TableCollectionTest.cs (100%) rename {Simple.Data.Ado.Test => src/Simple.Data.Ado.Test}/TestCustomInserter.cs (100%) rename {Simple.Data.Ado.Test => src/Simple.Data.Ado.Test}/TestProviderAssemblyAttribute.cs (100%) rename {Simple.Data.Ado.Test => src/Simple.Data.Ado.Test}/packages.config (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/AdoAdapter.IAdapterWithFunctions.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/AdoAdapter.IAdapterWithRelation.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/AdoAdapter.IAdapterWithTransactions.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/AdoAdapter.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/AdoAdapterException.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/AdoAdapterFinder.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/AdoAdapterGetter.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/AdoAdapterInserter.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/AdoAdapterQueryRunner.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/AdoAdapterRelatedFinder.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/AdoAdapterTransaction.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/AdoAdapterUpserter.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/AdoOptions.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/BulkInserter.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/BulkInserterHelper.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/BulkInserterTransactionHelper.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/BulkUpdater.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/CollectionGraphNode.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/CommandBuilder.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/CommandHelper.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/CommandTemplate.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/ConnectionEx.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/ConnectionScope.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/DataParameterCollectionEx.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/DataReaderEnumerable.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/DataReaderExtensions.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/DataReaderMultipleEnumerator.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/DataRecordExtensions.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/DatabaseObservable.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/DbCommandExtensions.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/DbConnectionEx.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/DbConnectionExtensions.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/DelegatingConnectionBase1.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/DeleteExecutor.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/DeleteHelper.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/DictionaryExtensions.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/EagerLoadingEnumerable.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/EventHandlerEx.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/ExecutorFactory.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/ExpressionFormatter.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/ExpressionFormatterBase.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/ExpressionHasher.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/FindHelper.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/FunctionExecutor.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/FunctionNameConverter.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/GenericDbParameterFactory.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/GetExecutor.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/GraphMap.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/GraphNode.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/HomogenizedDictionaryIndex.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/HomogenizedKeyDictionary.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/IBulkInserter.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/IBulkUpdater.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/ICommandBuilder.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/IConnectionProvider.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/ICustomInserter.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/ICustomQueryBuilder.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/IDbParameterFactory.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/IExpressionFormatter.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/IFunctionNameConverter.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/IObservableQueryRunner.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/IQueryPager.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/ISchemaGetter.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/ISqlOptimizer.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/InsertExecutor.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Joiner.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/ListExtensions.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/NugetPack.cmd (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/NugetPush.cmd (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/ObjectName.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/OptimizedDictionary.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/OptimizedDictionary2.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/OptimizedDictionaryIndex.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/ParameterTemplate.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/ProcedureExecutor.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Properties/AssemblyInfo.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Properties/Settings.Designer.cs (97%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Properties/Settings.settings (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/ProviderAssemblyAttributeBase.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/ProviderHelper.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/QueryBuilder.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/QueryBuilderBase.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/QueryExecutor.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Schema/AmbiguousObjectNameException.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Schema/Column.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Schema/ColumnCollection.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Schema/DatabaseSchema.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Schema/ForeignKey.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Schema/ForeignKeyCollection.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Schema/ISchemaProvider.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Schema/Key.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Schema/Parameter.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Schema/Procedure.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Schema/ProcedureCollection.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Schema/Table.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Schema/TableCollection.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Schema/TableJoin.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Schema/TableType.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/SchemaResolutionException.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Simple.Data.Ado.csproj (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/Simple.Data.Ado.nuspec (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/SimpleReferenceFormatter.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/SingleRecordGraphNode.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/SubDictionary.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/TraceHelper.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/TupleExtensions.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/TypeHelper.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/UpdateByCriteriaExecutor.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/UpdateEntityExecutor.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/UpdateHelper.cs (100%) rename {Simple.Data.Ado => src/Simple.Data.Ado}/app.config (98%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/AmbiguousForeignKeyTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/App.config (97%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/BulkInsertTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/DatabaseIntegrationContext.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/DeleteTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/ExceptionsTesting.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/FindTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/GetCountTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/GetTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/InsertTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/NameResolutionTests.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/NaturalJoinTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/NaturalNamingTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/ProcedureTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/Properties/AssemblyInfo.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/Query/DistinctTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/Query/ExplicitJoinTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/Query/FunctionTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/Query/HavingTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/Query/QueryTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/Query/WhereTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/Query/WithCountTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/Query/WithTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/RangeAndArrayFindTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/SchemaHelper.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/SchemaQualifiedTableTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/Simple.Data.BehaviourTest.csproj (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/StopUsingMockTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/TestTraceListener.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/TraceSettingsTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/TransactionTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/UpdateTest.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/User.cs (100%) rename {Simple.Data.BehaviourTest => src/Simple.Data.BehaviourTest}/packages.config (100%) rename {Simple.Data.GraphTest => src/Simple.Data.GraphTest}/App.config (100%) rename {Simple.Data.GraphTest => src/Simple.Data.GraphTest}/Graph.mdf (100%) rename {Simple.Data.GraphTest => src/Simple.Data.GraphTest}/GraphLoadTest.cs (100%) rename {Simple.Data.GraphTest => src/Simple.Data.GraphTest}/Graph_log.ldf (100%) rename {Simple.Data.GraphTest => src/Simple.Data.GraphTest}/Models/Customer.cs (100%) rename {Simple.Data.GraphTest => src/Simple.Data.GraphTest}/Properties/AssemblyInfo.cs (100%) rename {Simple.Data.GraphTest => src/Simple.Data.GraphTest}/Simple.Data.GraphTest.csproj (100%) rename {Simple.Data.GraphTest => src/Simple.Data.GraphTest}/packages.config (100%) rename {Simple.Data.InMemoryTest => src/Simple.Data.InMemoryTest}/CanAssignArray.cs (100%) rename {Simple.Data.InMemoryTest => src/Simple.Data.InMemoryTest}/InMemoryTests.cs (100%) rename {Simple.Data.InMemoryTest => src/Simple.Data.InMemoryTest}/NameResolutionTest.cs (100%) rename {Simple.Data.InMemoryTest => src/Simple.Data.InMemoryTest}/Properties/AssemblyInfo.cs (100%) rename {Simple.Data.InMemoryTest => src/Simple.Data.InMemoryTest}/Simple.Data.InMemoryTest.csproj (100%) rename {Simple.Data.InMemoryTest => src/Simple.Data.InMemoryTest}/SimpleQueryConversionTests.cs (100%) rename {Simple.Data.InMemoryTest => src/Simple.Data.InMemoryTest}/packages.config (100%) rename {Simple.Data.Migrations.Tests => src/Simple.Data.Migrations.Tests}/Class1.cs (100%) rename {Simple.Data.Migrations.Tests => src/Simple.Data.Migrations.Tests}/Properties/AssemblyInfo.cs (100%) rename {Simple.Data.Migrations.Tests => src/Simple.Data.Migrations.Tests}/Simple.Data.Migrations.Tests.csproj (100%) rename {Simple.Data.Migrations.Tests => src/Simple.Data.Migrations.Tests}/packages.config (100%) rename {Simple.Data.Migrations => src/Simple.Data.Migrations}/Class1.cs (100%) rename {Simple.Data.Migrations => src/Simple.Data.Migrations}/Properties/AssemblyInfo.cs (100%) rename {Simple.Data.Migrations => src/Simple.Data.Migrations}/Simple.Data.Migrations.csproj (100%) rename {Simple.Data.Mocking.Test => src/Simple.Data.Mocking.Test}/MockConnectionSchemaTest.cs (100%) rename {Simple.Data.Mocking.Test => src/Simple.Data.Mocking.Test}/Properties/AssemblyInfo.cs (100%) rename {Simple.Data.Mocking.Test => src/Simple.Data.Mocking.Test}/Simple.Data.Mocking.Test.csproj (97%) rename {Simple.Data.Mocking.Test => src/Simple.Data.Mocking.Test}/XmlMockAdapterTest.cs (100%) rename {Simple.Data.Mocking.Test => src/Simple.Data.Mocking.Test}/packages.config (100%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/Ado/DataRowExtensions.cs (100%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/Ado/DataTableExtensions.cs (100%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/Ado/MockConnectionProvider.cs (100%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/Ado/MockDataParameter.cs (100%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/Ado/MockDataParameterCollection.cs (100%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/Ado/MockDataReader.cs (100%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/Ado/MockDataRecord.cs (100%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/Ado/MockDatabase.cs (100%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/Ado/MockDbCommand.cs (100%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/Ado/MockDbConnection.cs (100%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/Ado/MockDbTransaction.cs (100%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/Ado/MockSchemaProvider.cs (100%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/MockHelper.cs (100%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/NugetPack.cmd (100%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/NugetPush.cmd (100%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/Properties/AssemblyInfo.cs (100%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/Simple.Data.Mocking.csproj (97%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/Simple.Data.Mocking.nuspec (100%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/XElementExtensions.cs (100%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/XmlMockAdapter.cs (97%) rename {Simple.Data.Mocking => src/Simple.Data.Mocking}/XmlPredicateBuilder.cs (100%) rename {Simple.Data.SqlCe35 => src/Simple.Data.SqlCe35}/Properties/AssemblyInfo.cs (100%) rename {Simple.Data.SqlCe35 => src/Simple.Data.SqlCe35}/Properties/Resources.Designer.cs (100%) rename {Simple.Data.SqlCe35 => src/Simple.Data.SqlCe35}/Properties/Resources.resx (100%) rename {Simple.Data.SqlCe35 => src/Simple.Data.SqlCe35}/Resources/ForeignKeysSql.txt (100%) rename {Simple.Data.SqlCe35 => src/Simple.Data.SqlCe35}/Resources/PrimaryKeysSql.txt (100%) rename {Simple.Data.SqlCe35 => src/Simple.Data.SqlCe35}/Simple.Data.SqlCe35.csproj (100%) rename {Simple.Data.SqlCe35 => src/Simple.Data.SqlCe35}/SqlCe35ConnectionProvider.cs (100%) rename {Simple.Data.SqlCe35 => src/Simple.Data.SqlCe35}/SqlCe35SchemaProvider.cs (100%) rename {Simple.Data.SqlCe35 => src/Simple.Data.SqlCe35}/app.config (100%) rename {Simple.Data.SqlCe35Test => src/Simple.Data.SqlCe35Test}/FindTests.cs (100%) rename {Simple.Data.SqlCe35Test => src/Simple.Data.SqlCe35Test}/OrderDetailTests.cs (100%) rename {Simple.Data.SqlCe35Test => src/Simple.Data.SqlCe35Test}/Properties/AssemblyInfo.cs (100%) rename {Simple.Data.SqlCe35Test => src/Simple.Data.SqlCe35Test}/SchemaTests/DatabaseSchemaTests.cs (100%) rename {Simple.Data.SqlCe35Test => src/Simple.Data.SqlCe35Test}/Simple.Data.SqlCe35Test.csproj (100%) rename {Simple.Data.SqlCe35Test => src/Simple.Data.SqlCe35Test}/TestDatabase.sdf (100%) rename {Simple.Data.SqlCe35Test => src/Simple.Data.SqlCe35Test}/User.cs (100%) rename {Simple.Data.SqlCe35Test => src/Simple.Data.SqlCe35Test}/packages.config (100%) rename {Simple.Data.SqlCe40 => src/Simple.Data.SqlCe40}/DbTypeLookup.cs (100%) rename {Simple.Data.SqlCe40 => src/Simple.Data.SqlCe40}/NugetPack.cmd (100%) rename {Simple.Data.SqlCe40 => src/Simple.Data.SqlCe40}/NugetPush.cmd (100%) rename {Simple.Data.SqlCe40 => src/Simple.Data.SqlCe40}/Properties/AssemblyInfo.cs (100%) rename {Simple.Data.SqlCe40 => src/Simple.Data.SqlCe40}/Properties/Resources.Designer.cs (98%) rename {Simple.Data.SqlCe40 => src/Simple.Data.SqlCe40}/Properties/Resources.resources (100%) rename {Simple.Data.SqlCe40 => src/Simple.Data.SqlCe40}/Properties/Resources.resx (100%) rename {Simple.Data.SqlCe40 => src/Simple.Data.SqlCe40}/Resources/ForeignKeysSql.txt (100%) rename {Simple.Data.SqlCe40 => src/Simple.Data.SqlCe40}/Resources/PrimaryKeysSql.txt (100%) rename {Simple.Data.SqlCe40 => src/Simple.Data.SqlCe40}/Simple.Data.SqlCe40.csproj (97%) rename {Simple.Data.SqlCe40 => src/Simple.Data.SqlCe40}/Simple.Data.SqlCe40.nuspec (100%) rename {Simple.Data.SqlCe40 => src/Simple.Data.SqlCe40}/SqlCe40ConnectionProvider.cs (100%) rename {Simple.Data.SqlCe40 => src/Simple.Data.SqlCe40}/SqlCe40ProviderAttribute.cs (100%) rename {Simple.Data.SqlCe40 => src/Simple.Data.SqlCe40}/SqlCe40QueryPager.cs (100%) rename {Simple.Data.SqlCe40 => src/Simple.Data.SqlCe40}/SqlCe40SchemaProvider.cs (100%) rename {Simple.Data.SqlCe40 => src/Simple.Data.SqlCe40}/SqlCeColumn.cs (100%) rename {Simple.Data.SqlCe40 => src/Simple.Data.SqlCe40}/SqlCeDbParameterFactory.cs (100%) rename {Simple.Data.SqlCe40 => src/Simple.Data.SqlCe40}/SqlTypeResolver.cs (100%) rename {Simple.Data.SqlCe40 => src/Simple.Data.SqlCe40}/packages.config (97%) rename {Simple.Data.SqlCe40Test => src/Simple.Data.SqlCe40Test}/ConnectionProviderTest.cs (100%) rename {Simple.Data.SqlCe40Test => src/Simple.Data.SqlCe40Test}/FindTests.cs (100%) rename {Simple.Data.SqlCe40Test => src/Simple.Data.SqlCe40Test}/InsertTests.cs (100%) rename {Simple.Data.SqlCe40Test => src/Simple.Data.SqlCe40Test}/Northwind.sdf (100%) rename {Simple.Data.SqlCe40Test => src/Simple.Data.SqlCe40Test}/NorthwindTests.cs (100%) rename {Simple.Data.SqlCe40Test => src/Simple.Data.SqlCe40Test}/OrderDetailTests.cs (100%) rename {Simple.Data.SqlCe40Test => src/Simple.Data.SqlCe40Test}/Properties/AssemblyInfo.cs (100%) rename {Simple.Data.SqlCe40Test => src/Simple.Data.SqlCe40Test}/QueryTest.cs (100%) rename {Simple.Data.SqlCe40Test => src/Simple.Data.SqlCe40Test}/SchemaProviderTest.cs (100%) rename {Simple.Data.SqlCe40Test => src/Simple.Data.SqlCe40Test}/SchemaTests/DatabaseSchemaTests.cs (100%) rename {Simple.Data.SqlCe40Test => src/Simple.Data.SqlCe40Test}/Setup.cs (100%) rename {Simple.Data.SqlCe40Test => src/Simple.Data.SqlCe40Test}/Simple.Data.SqlCe40Test.csproj (100%) rename {Simple.Data.SqlCe40Test => src/Simple.Data.SqlCe40Test}/SqlCe40QueryPagerTest.cs (100%) rename {Simple.Data.SqlCe40Test => src/Simple.Data.SqlCe40Test}/TestDatabase.sdf (100%) rename {Simple.Data.SqlCe40Test => src/Simple.Data.SqlCe40Test}/User.cs (100%) rename {Simple.Data.SqlCe40Test => src/Simple.Data.SqlCe40Test}/packages.config (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/DbTypeLookup.cs (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/NugetPack.cmd (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/NugetPush.cmd (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/Properties/AssemblyInfo.cs (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/Properties/Resources.Designer.cs (97%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/Properties/Resources.resources (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/Properties/Resources.resx (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/Resources/ForeignKeysSql.txt (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/Resources/PrimaryKeySql.txt (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/Simple.Data.SqlServer.csproj (97%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/Simple.Data.SqlServer.nuspec (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/SqlBulkInserter.cs (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/SqlColumn.cs (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/SqlCommandOptimizer.cs (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/SqlConnectionProvider.cs (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/SqlCustomInserter.cs (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/SqlCustomQueryBuilder.cs (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/SqlDbParameterFactory.cs (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/SqlDbTypeEx.cs (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/SqlObservableQueryRunner.cs (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/SqlQueryBuilder.cs (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/SqlQueryPager.cs (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/SqlSchemaProvider.cs (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/SqlServerProviderAttribute.cs (100%) rename {Simple.Data.SqlServer => src/Simple.Data.SqlServer}/SqlTypeResolver.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/BulkInsertTest.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/ConversionTests.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/DatabaseHelper.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/DatabaseOpenerTests.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/DbImage.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/DeleteTest.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/EnumTest.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/FindTests.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/FunctionTest.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/GetTests.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/InsertTests.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/NaturalJoinTest.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/OrderDetailTests.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/ProcedureTest.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/Properties/AssemblyInfo.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/Properties/Resources.Designer.cs (98%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/Properties/Resources.resources (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/Properties/Resources.resx (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/Properties/Settings.Designer.cs (97%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/Properties/Settings.settings (98%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/QueryTest.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/Resources/DatabaseReset.txt (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/Resources/GetImage.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/Resources/test.png (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/SchemaQualifiedTests.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/SchemaTests/DataTypeTests.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/SchemaTests/DatabaseSchemaTests.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/SetupFixture.cs (96%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/Simple.Data.SqlTest.csproj (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/SimpleTest.mdf (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/SimpleTest_log.ldf (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/SqlQueryPagerTest.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/TestTraceListener.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/TransactionTests.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/UpdateTests.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/UpsertTests.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/User.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/WeirdTypeTest.cs (100%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/app.config (98%) rename {Simple.Data.SqlTest => src/Simple.Data.SqlTest}/packages.config (100%) rename {Simple.Data.TestHelper => src/Simple.Data.TestHelper}/DatabaseInternalsEx.cs (100%) rename {Simple.Data.TestHelper => src/Simple.Data.TestHelper}/DatabaseSchemaTestsBase.cs (100%) rename {Simple.Data.TestHelper => src/Simple.Data.TestHelper}/Properties/AssemblyInfo.cs (100%) rename {Simple.Data.TestHelper => src/Simple.Data.TestHelper}/Simple.Data.TestHelper.csproj (100%) rename {Simple.Data.TestHelper => src/Simple.Data.TestHelper}/packages.config (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/AdapterFactoryTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/BeginTransactionWithIsolataionLevelTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/BinderHelperTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/CheckedEnumerableTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/ComposerTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/ConcreteCollectionTypeCreatorTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/ConcreteTypeCreatorTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/DatabaseOpenerTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/DictionaryClonerTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/DictionaryQueryRunnerTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/DynamicEnumerableTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/DynamicRecordTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/DynamicReferenceTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/DynamicStringExtensionsTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/DynamicTableTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/EagerLoadingEnumerableTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/ExpressionHelperTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/GroupingHandlerTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/ListHelper.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/MathReferenceTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/MaybeTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/MethodNameParserTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/ObjectReferenceTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/PluralizationTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/PromiseTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/Properties/AssemblyInfo.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/PropertySetterBuilderTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/RangeTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/Simple.Data.UnitTest.csproj (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/SimpleDataExceptionTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/SimpleExpressionTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/SimpleListAsListTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/SimpleListTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/SimpleQueryTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/SimpleRecordAsDictionaryTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/SimpleRecordCloneTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/SimpleRecordConvertTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/SimpleResultSetTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/SpecialReferenceTests.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/StringExtensionsTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/UnresolvableObjectExceptionTest.cs (100%) rename {Simple.Data.UnitTest => src/Simple.Data.UnitTest}/packages.config (100%) rename Simple.Data.sln => src/Simple.Data.sln (100%) rename Simple.Data.userprefs => src/Simple.Data.userprefs (100%) rename Simple.Data.vsmdi => src/Simple.Data.vsmdi (100%) rename {Simple.Data => src/Simple.Data}/ActionDisposable.cs (100%) rename {Simple.Data => src/Simple.Data}/Adapter.cs (100%) rename {Simple.Data => src/Simple.Data}/AdapterException.cs (100%) rename {Simple.Data => src/Simple.Data}/AdapterFactory.cs (100%) rename {Simple.Data => src/Simple.Data}/AdapterHelper.cs (100%) rename {Simple.Data => src/Simple.Data}/AdapterMethodDynamicInvoker.cs (100%) rename {Simple.Data => src/Simple.Data}/AdapterWithFunctionsExtensions.cs (100%) rename {Simple.Data => src/Simple.Data}/AdoCompatibleComparer.cs (100%) rename {Simple.Data => src/Simple.Data}/AllColumnsSpecialReference.cs (100%) rename {Simple.Data => src/Simple.Data}/Argument.cs (100%) rename {Simple.Data => src/Simple.Data}/ArgumentCollection.cs (100%) rename {Simple.Data => src/Simple.Data}/AssemblyEx.cs (100%) rename {Simple.Data => src/Simple.Data}/BadExpressionException.cs (100%) rename {Simple.Data => src/Simple.Data}/BinderHelper.cs (100%) rename {Simple.Data => src/Simple.Data}/CachingAdapterFactory.cs (100%) rename {Simple.Data => src/Simple.Data}/CastEnumerable.cs (100%) rename {Simple.Data => src/Simple.Data}/CheckedEnumerable.cs (100%) rename {Simple.Data => src/Simple.Data}/Command.cs (100%) rename {Simple.Data => src/Simple.Data}/CommandResult.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/AllCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/ArgumentHelper.cs (97%) rename {Simple.Data => src/Simple.Data}/Commands/CommandFactory.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/DeleteAllCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/DeleteByCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/ExecuteFunctionCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/ExistsByCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/ExistsCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/FindAllByCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/FindAllCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/FindByCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/FindCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/GetCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/GetCountByCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/GetCountCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/ICommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/InsertCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/QueryByCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/QueryCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/ResultHelper.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/UpdateAllCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/UpdateByCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/UpdateCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/UpsertByCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/Commands/UpsertCommand.cs (100%) rename {Simple.Data => src/Simple.Data}/CommonTypes.cs (100%) rename {Simple.Data => src/Simple.Data}/Composer.cs (100%) rename {Simple.Data => src/Simple.Data}/ConcreteCollectionTypeCreator.cs (100%) rename {Simple.Data => src/Simple.Data}/ConcreteObject.cs (100%) rename {Simple.Data => src/Simple.Data}/ConcreteTypeCreator.cs (100%) rename {Simple.Data => src/Simple.Data}/CountSpecialReference.cs (100%) rename {Simple.Data => src/Simple.Data}/DataResult.cs (100%) rename {Simple.Data => src/Simple.Data}/DataStrategy.cs (100%) rename {Simple.Data => src/Simple.Data}/DataStrategyWithOptions.cs (100%) rename {Simple.Data => src/Simple.Data}/Database.Open.cs (100%) rename {Simple.Data => src/Simple.Data}/Database.cs (100%) rename {Simple.Data => src/Simple.Data}/DatabaseOpener.cs (100%) rename {Simple.Data => src/Simple.Data}/DatabaseOpenerMethods.cs (100%) rename {Simple.Data => src/Simple.Data}/DatabaseRunner.cs (100%) rename {Simple.Data => src/Simple.Data}/DictionaryCloner.cs (100%) rename {Simple.Data => src/Simple.Data}/DistinctClause.cs (100%) rename {Simple.Data => src/Simple.Data}/DynamicSchema.cs (100%) rename {Simple.Data => src/Simple.Data}/DynamicTable.cs (100%) rename {Simple.Data => src/Simple.Data}/EnumerableEx.cs (97%) rename {Simple.Data => src/Simple.Data}/ErrorCallback.cs (100%) rename {Simple.Data => src/Simple.Data}/ExistsSpecialReference.cs (100%) rename {Simple.Data => src/Simple.Data}/ExpressionHelper.cs (100%) rename {Simple.Data => src/Simple.Data}/Extensions/ArrayExtensions.cs (100%) rename {Simple.Data => src/Simple.Data}/Extensions/BinderExtensions.cs (100%) rename {Simple.Data => src/Simple.Data}/Extensions/DynamicStringExtensions.cs (100%) rename {Simple.Data => src/Simple.Data}/Extensions/EnumerableExtensions.cs (100%) rename {Simple.Data => src/Simple.Data}/Extensions/HomogenizeEx.cs (100%) rename {Simple.Data => src/Simple.Data}/Extensions/IDictionaryExtensions.cs (100%) rename {Simple.Data => src/Simple.Data}/Extensions/ObjectEx.cs (97%) rename {Simple.Data => src/Simple.Data}/Extensions/ResultSetExtensions.cs (100%) rename {Simple.Data => src/Simple.Data}/Extensions/StringExtensions.cs (100%) rename {Simple.Data => src/Simple.Data}/ForUpdateClause.cs (100%) rename {Simple.Data => src/Simple.Data}/FunctionReference.cs (100%) rename {Simple.Data => src/Simple.Data}/FunctionReturnType.cs (100%) rename {Simple.Data => src/Simple.Data}/FunctionSignature.cs (100%) rename {Simple.Data => src/Simple.Data}/Future1.cs (100%) rename {Simple.Data => src/Simple.Data}/HavingClause.cs (100%) rename {Simple.Data => src/Simple.Data}/HomogenizedEqualityComparer.cs (100%) rename {Simple.Data => src/Simple.Data}/IAdapterFactory.cs (100%) rename {Simple.Data => src/Simple.Data}/IAdapterTransaction.cs (100%) rename {Simple.Data => src/Simple.Data}/IAdapterWithRelation.cs (100%) rename {Simple.Data => src/Simple.Data}/IAdapterWithTransactions.cs (100%) rename {Simple.Data => src/Simple.Data}/IDatabase.cs (100%) rename {Simple.Data => src/Simple.Data}/IDatabaseOpener.cs (100%) rename {Simple.Data => src/Simple.Data}/IPluralizer.cs (100%) rename {Simple.Data => src/Simple.Data}/IRange.cs (100%) rename {Simple.Data => src/Simple.Data}/InMemoryAdapter.cs (100%) rename {Simple.Data => src/Simple.Data}/InMemoryAdapterIAdapterWithRelation.cs (100%) rename {Simple.Data => src/Simple.Data}/InMemoryAdapterIAdapterWithTransactions.cs (100%) rename {Simple.Data => src/Simple.Data}/JoinClause.cs (100%) rename {Simple.Data => src/Simple.Data}/JoinType.cs (100%) rename {Simple.Data => src/Simple.Data}/MathReference.cs (100%) rename {Simple.Data => src/Simple.Data}/Maybe.cs (100%) rename {Simple.Data => src/Simple.Data}/MefHelper.cs (100%) rename {Simple.Data => src/Simple.Data}/MethodNameParser.cs (97%) rename {Simple.Data => src/Simple.Data}/MultiDataResult.cs (100%) rename {Simple.Data => src/Simple.Data}/NugetPack.cmd (100%) rename {Simple.Data => src/Simple.Data}/NugetPush.cmd (100%) rename {Simple.Data => src/Simple.Data}/ObjectReference.cs (100%) rename {Simple.Data => src/Simple.Data}/OfTypeEnumerable.cs (100%) rename {Simple.Data => src/Simple.Data}/OperationResult.cs (100%) rename {Simple.Data => src/Simple.Data}/Operations/DeleteOperation.cs (100%) rename {Simple.Data => src/Simple.Data}/Operations/GetOperation.cs (100%) rename {Simple.Data => src/Simple.Data}/Operations/InsertOperation.cs (100%) rename {Simple.Data => src/Simple.Data}/Operations/Operation.cs (93%) rename {Simple.Data => src/Simple.Data}/Operations/QueryOperation.cs (100%) rename {Simple.Data => src/Simple.Data}/Operations/UpdateByCriteriaOperation.cs (100%) rename {Simple.Data => src/Simple.Data}/Operations/UpdateEntityOperation.cs (100%) rename {Simple.Data => src/Simple.Data}/Operations/UpsertOperation.cs (100%) rename {Simple.Data => src/Simple.Data}/OptionsBase.cs (100%) rename {Simple.Data => src/Simple.Data}/OrderByClause.cs (100%) rename {Simple.Data => src/Simple.Data}/OrderByDirection.cs (100%) rename {Simple.Data => src/Simple.Data}/Promise.cs (100%) rename {Simple.Data => src/Simple.Data}/Properties/AssemblyInfo.cs (100%) rename {Simple.Data => src/Simple.Data}/Properties/Resources.resources (100%) rename {Simple.Data => src/Simple.Data}/PropertySetterBuilder.cs (98%) rename {Simple.Data => src/Simple.Data}/QueryPolyfills/AggregateValueResolver.cs (100%) rename {Simple.Data => src/Simple.Data}/QueryPolyfills/DictionaryCreatorFactory.cs (100%) rename {Simple.Data => src/Simple.Data}/QueryPolyfills/DictionaryEqualityComparer.cs (100%) rename {Simple.Data => src/Simple.Data}/QueryPolyfills/DictionaryQueryRunner.cs (100%) rename {Simple.Data => src/Simple.Data}/QueryPolyfills/FunctionHandlers.cs (100%) rename {Simple.Data => src/Simple.Data}/QueryPolyfills/FunctionValueResolver.cs (100%) rename {Simple.Data => src/Simple.Data}/QueryPolyfills/GroupingHandler.cs (100%) rename {Simple.Data => src/Simple.Data}/QueryPolyfills/ObjectMaths.cs (100%) rename {Simple.Data => src/Simple.Data}/QueryPolyfills/ObjectValueResolver.cs (100%) rename {Simple.Data => src/Simple.Data}/QueryPolyfills/OrderByClauseHandler.cs (100%) rename {Simple.Data => src/Simple.Data}/QueryPolyfills/SelectClauseHandler.cs (100%) rename {Simple.Data => src/Simple.Data}/QueryPolyfills/ValueResolver.cs (100%) rename {Simple.Data => src/Simple.Data}/QueryPolyfills/WhereClauseHandler.cs (97%) rename {Simple.Data => src/Simple.Data}/QueryResult.cs (100%) rename {Simple.Data => src/Simple.Data}/Range.cs (100%) rename {Simple.Data => src/Simple.Data}/Range1.cs (100%) rename {Simple.Data => src/Simple.Data}/RunStrategy.cs (100%) rename {Simple.Data => src/Simple.Data}/SelectClause.cs (100%) rename {Simple.Data => src/Simple.Data}/Simple.Data.csproj (100%) rename {Simple.Data => src/Simple.Data}/Simple.Data.dll.config (100%) rename {Simple.Data => src/Simple.Data}/Simple.Data.nuspec (100%) rename {Simple.Data => src/Simple.Data}/SimpleDataConfigurationSection.cs (100%) rename {Simple.Data => src/Simple.Data}/SimpleDataException.cs (100%) rename {Simple.Data => src/Simple.Data}/SimpleDataTraceSources.cs (100%) rename {Simple.Data => src/Simple.Data}/SimpleEmptyExpression.cs (100%) rename {Simple.Data => src/Simple.Data}/SimpleExpression.cs (100%) rename {Simple.Data => src/Simple.Data}/SimpleExpressionType.cs (100%) rename {Simple.Data => src/Simple.Data}/SimpleFunction.cs (100%) rename {Simple.Data => src/Simple.Data}/SimpleList.cs (100%) rename {Simple.Data => src/Simple.Data}/SimpleObservable.cs (100%) rename {Simple.Data => src/Simple.Data}/SimpleOrderByItem.cs (100%) rename {Simple.Data => src/Simple.Data}/SimpleQuery.cs (100%) rename {Simple.Data => src/Simple.Data}/SimpleQueryClauseBase.cs (100%) rename {Simple.Data => src/Simple.Data}/SimpleRecord.Dictionary2.cs (100%) rename {Simple.Data => src/Simple.Data}/SimpleRecord.cs (100%) rename {Simple.Data => src/Simple.Data}/SimpleReference.cs (100%) rename {Simple.Data => src/Simple.Data}/SimpleResultSet.cs (100%) rename {Simple.Data => src/Simple.Data}/SimpleTransaction.cs (100%) rename {Simple.Data => src/Simple.Data}/SkipClause.cs (100%) rename {Simple.Data => src/Simple.Data}/SpecialReference.cs (100%) rename {Simple.Data => src/Simple.Data}/TakeClause.cs (100%) rename {Simple.Data => src/Simple.Data}/TransactionRunner.cs (100%) rename {Simple.Data => src/Simple.Data}/TypeExtensions.cs (100%) rename {Simple.Data => src/Simple.Data}/UnresolvableObjectException.cs (100%) rename {Simple.Data => src/Simple.Data}/WhereClause.cs (100%) rename {Simple.Data => src/Simple.Data}/WithClause.cs (100%) rename {Simple.Data => src/Simple.Data}/WithCountClause.cs (100%) rename {Simple.Data => src/Simple.Data}/WithMode.cs (100%) rename {Simple.Data => src/Simple.Data}/WithType.cs (100%) rename {Simple.Data => src/Simple.Data}/app.config (98%) rename Simple_Data.ndproj => src/Simple_Data.ndproj (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/Logo.ico (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/NUnit.2.5.10.11092.nuspec (98%) rename {packages => src/packages}/NUnit.2.5.10.11092/NUnitFitTests.html (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/fit-license.txt (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/lib/nunit.framework.xml (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/license.txt (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/NUnitTests.VisualState.xml (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/NUnitTests.config (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/NUnitTests.nunit (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/TestResult.xml (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/agent.conf (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/agent.log.conf (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/launcher.log.conf (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/lib/Failure.png (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/lib/Ignored.png (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/lib/Inconclusive.png (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/lib/Skipped.png (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/lib/Success.png (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/nunit-agent-x86.exe.config (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/nunit-agent.exe.config (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/nunit-console-x86.exe.config (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/nunit-console.exe.config (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/nunit-x86.exe.config (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/nunit.exe.config (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/pnunit-agent.exe.config (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/pnunit-launcher.exe.config (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/runFile.exe.config (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/runpnunit.bat (100%) rename {packages => src/packages}/NUnit.2.5.10.11092/tools/test.conf (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Logo.ico (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/NUnit.2.5.9.10348.nuspec (98%) rename {packages => src/packages}/NUnit.2.5.9.10348/NUnitFitTests.html (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/NUnitFitTests.html (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/NUnitTests.config (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/NUnitTests.nunit (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/agent.conf (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/agent.log.conf (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/launcher.log.conf (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/lib/Failure.png (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/lib/Ignored.png (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/lib/Inconclusive.png (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/lib/Skipped.png (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/lib/Success.png (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/nunit-agent-x86.exe.config (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/nunit-agent.exe.config (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/nunit-console-x86.exe.config (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/nunit-console.exe.config (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/nunit-x86.exe.config (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/nunit.exe.config (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/pnunit-agent.exe.config (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/pnunit-launcher.exe.config (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/runFile.exe.config (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/runpnunit.bat (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/Tools/test.conf (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/fit-license.txt (100%) rename {packages => src/packages}/NUnit.2.5.9.10348/lib/nunit.framework.xml (98%) rename {packages => src/packages}/NUnit.2.5.9.10348/license.txt (100%) rename {packages => src/packages}/NUnit.2.6.3/NUnit.2.6.3.nuspec (100%) rename {packages => src/packages}/NUnit.2.6.3/lib/nunit.framework.xml (100%) rename {packages => src/packages}/NUnit.2.6.3/license.txt (100%) rename {packages => src/packages}/Simple.Data.Ado.0.6.1/Simple.Data.Ado.0.6.1.nuspec (97%) rename {packages => src/packages}/Simple.Data.Core.0.6.1/Simple.Data.Core.0.6.1.nuspec (97%) rename {packages => src/packages}/Simple.Data.SqlCompact40.0.6.1/Simple.Data.SqlCompact40.0.6.1.nuspec (98%) rename {packages => src/packages}/SqlServerCompact.4.0.8482.1/Content/web.config.transform (100%) rename {packages => src/packages}/SqlServerCompact.4.0.8482.1/NativeBinaries/amd64/Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest (99%) rename {packages => src/packages}/SqlServerCompact.4.0.8482.1/NativeBinaries/amd64/Microsoft.VC90.CRT/README_ENU.txt (100%) rename {packages => src/packages}/SqlServerCompact.4.0.8482.1/NativeBinaries/x86/Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest (99%) rename {packages => src/packages}/SqlServerCompact.4.0.8482.1/NativeBinaries/x86/Microsoft.VC90.CRT/README_ENU.txt (100%) rename {packages => src/packages}/SqlServerCompact.4.0.8482.1/SQLCE_EULA_ENU.rtf (100%) rename {packages => src/packages}/SqlServerCompact.4.0.8482.1/SqlServerCompact.4.0.8482.1.nuspec (97%) rename {packages => src/packages}/SqlServerCompact.4.0.8482.1/Tools/GetSqlCEPostBuildCmd.ps1 (97%) rename {packages => src/packages}/SqlServerCompact.4.0.8482.1/Tools/install.ps1 (100%) rename {packages => src/packages}/SqlServerCompact.4.0.8482.1/Tools/uninstall.ps1 (100%) rename {packages => src/packages}/Trespasser.1.1/Trespasser.1.1.nuspec (97%) rename {packages => src/packages}/repositories.config (100%) diff --git a/Assemblies/Microsoft.SqlServer.Types.dll b/Assemblies/Microsoft.SqlServer.Types.dll deleted file mode 100644 index a4d5a77766f5dbadf75bbfdb7a5be24d13d52f1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310624 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

12=e^#)b?$!kB8f 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 z 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 diff --git a/Assemblies/System.Data.SqlServerCe.dll b/Assemblies/System.Data.SqlServerCe.dll deleted file mode 100644 index 7311ab0f35c7b93f38dfade24b0eb1501e222288..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296816 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

#n7M;S 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

H~_A3gTaB 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 diff --git a/Assemblies/sqlcecompact35.dll b/Assemblies/sqlcecompact35.dll deleted file mode 100644 index c9f7409075c61cff5e257bbba30ede18d36f98af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83312 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 Rqj~FFCh=T1aI1-d0RV6w{jLB2 diff --git a/Assemblies/sqlceer35EN.dll b/Assemblies/sqlceer35EN.dll deleted file mode 100644 index 499a52b2569b8ad73657df203ac192794ff89ab6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147312 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 Mt1K*sJXQDq0B5MXdjJ3c diff --git a/Assemblies/sqlceme35.dll b/Assemblies/sqlceme35.dll deleted file mode 100644 index f2b87b4459e0206d6cf13b9058196467b4e92792..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63344 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 diff --git a/Assemblies/sqlceoledb35.dll b/Assemblies/sqlceoledb35.dll deleted file mode 100644 index 96a09c1d556d45e01409eac8e8ca9473e8eb4adb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169328 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⁣b$`GG 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�w%Ev(5$y0&!`N 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

O|k+%>M_k!IncT{=hEL2WW-mFST0w-lBCM4KFnp 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

+ + + +
NUnit.Fixtures.PlatformInfo
+

Verify Unit Tests

+

+ Load and run the NUnit unit tests, verifying that the results are as expected. + When these tests are run on different platforms, different numbers of tests may + be skipped, so the values for Skipped and Run tests are informational only. +

+ The number of tests in each assembly should be constant across all platforms - + any discrepancy usually means that one of the test source files was not + compiled on the platform. There should be no failures and no tests ignored. +

Note: + At the moment, the nunit.extensions.tests assembly is failing because the + fixture doesn't initialize addins in the test domain. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NUnit.Fixtures.AssemblyRunner
AssemblyTests()Run()Skipped()Ignored()Failures()
nunit.framework.tests.dll397  00
nunit.core.tests.dll355  00
nunit.util.tests.dll238  00
nunit.mocks.tests.dll43  00
nunit.extensions.tests.dll5  00
nunit-console.tests.dll40  00
nunit.uikit.tests.dll34  00
nunit-gui.tests.dll15  00
nunit.fixtures.tests.dll6  00
+

Code Snippet Tests

+

+ These tests create a test assembly from a snippet of code and then load and run + the tests that it contains, verifying that the structure of the loaded tests is + as expected and that the number of tests run, skipped, ignored or failed is + correct. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NUnit.Fixtures.SnippetRunner
CodeTree()Run()Skipped()Ignored()Failures()
public class TestClass
+{
+}
+
EMPTY0000
using NUnit.Framework;
+
+[TestFixture]
+public class TestClass
+{
+}
+
TestClass0000
using NUnit.Framework;
+
+[TestFixture]
+public class TestClass
+{
+    [Test]
+    public void T1() { }
+    [Test]
+    public void T2() { }
+    [Test]
+    public void T3() { }
+}
+
TestClass
+>T1
+>T2
+>T3
+
3000
using NUnit.Framework;
+
+[TestFixture]
+public class TestClass1
+{
+    [Test]
+    public void T1() { }
+}
+
+[TestFixture]
+public class TestClass2
+{
+    [Test]
+    public void T2() { }
+    [Test]
+    public void T3() { }
+}
+
TestClass1
+>T1
+TestClass2
+>T2
+>T3
+
3000
using NUnit.Framework;
+
+[TestFixture]
+public class TestClass
+{
+    [Test]
+    public void T1() { }
+    [Test, Ignore]
+    public void T2() { }
+    [Test]
+    public void T3() { }
+}
+
TestClass
+>T1
+>T2
+>T3
+
2010
using NUnit.Framework;
+
+[TestFixture]
+public class TestClass
+{
+    [Test]
+    public void T1() { }
+    [Test, Explicit]
+    public void T2() { }
+    [Test]
+    public void T3() { }
+}
+
TestClass
+>T1
+>T2
+>T3
+
2100
+

Summary Information

+ + + + +
fit.Summary
+ + diff --git a/tools/NUnit/NUnitTests.config b/tools/NUnit/NUnitTests.config new file mode 100644 index 00000000..72ed67c7 --- /dev/null +++ b/tools/NUnit/NUnitTests.config @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/NUnit/NUnitTests.nunit b/tools/NUnit/NUnitTests.nunit new file mode 100644 index 00000000..15b98d3f --- /dev/null +++ b/tools/NUnit/NUnitTests.nunit @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/tools/NUnit/TestResult-net-3.5.xml b/tools/NUnit/TestResult-net-3.5.xml new file mode 100644 index 00000000..531cdf7c --- /dev/null +++ b/tools/NUnit/TestResult-net-3.5.xml @@ -0,0 +1,5991 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/NUnit/agent.conf b/tools/NUnit/agent.conf new file mode 100644 index 00000000..ddbcd8ea --- /dev/null +++ b/tools/NUnit/agent.conf @@ -0,0 +1,4 @@ + + 8080 + . + \ No newline at end of file diff --git a/tools/NUnit/agent.log.conf b/tools/NUnit/agent.log.conf new file mode 100644 index 00000000..b5bcd9da --- /dev/null +++ b/tools/NUnit/agent.log.conf @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/tools/NUnit/framework/nunit.framework.xml b/tools/NUnit/framework/nunit.framework.xml new file mode 100644 index 00000000..4c8c26e8 --- /dev/null +++ b/tools/NUnit/framework/nunit.framework.xml @@ -0,0 +1,10960 @@ + + + + nunit.framework + + + + + The different targets a test action attribute can be applied to + + + + + Default target, which is determined by where the action attribute is attached + + + + + Target a individual test case + + + + + Target a suite of test cases + + + + + Delegate used by tests that execute code and + capture any thrown exception. + + + + + The Assert class contains a collection of static methods that + implement the most common assertions used in NUnit. + + + + + We don't actually want any instances of this object, but some people + like to inherit from it to add other static methods. Hence, the + protected constructor disallows any instances of this object. + + + + + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + + The message to initialize the with. + + + + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + + + + + Throws an with the message and arguments + that are passed in. This is used by the other Assert functions. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws an with the message that is + passed in. This is used by the other Assert functions. + + The message to initialize the with. + + + + Throws an . + This is used by the other Assert functions. + + + + + Throws an with the message and arguments + that are passed in. This causes the test to be reported as ignored. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws an with the message that is + passed in. This causes the test to be reported as ignored. + + The message to initialize the with. + + + + Throws an . + This causes the test to be reported as ignored. + + + + + Throws an with the message and arguments + that are passed in. This causes the test to be reported as inconclusive. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws an with the message that is + passed in. This causes the test to be reported as inconclusive. + + The message to initialize the with. + + + + Throws an . + This causes the test to be reported as Inconclusive. + + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The actual value to test + A Constraint to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The actual value to test + A Constraint to be applied + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display if the condition is false + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The actual value to test + A Constraint to be applied + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The actual value to test + A Constraint to be applied + The message that will be displayed on failure + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The actual value to test + A Constraint to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + Used as a synonym for That in rare cases where a private setter + causes a Visual Basic compilation error. + + The actual value to test + A Constraint to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + Used as a synonym for That in rare cases where a private setter + causes a Visual Basic compilation error. + + The actual value to test + A Constraint to be applied + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + Used as a synonym for That in rare cases where a private setter + causes a Visual Basic compilation error. + + + This method is provided for use by VB developers needing to test + the value of properties with private setters. + + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. + + A constraint to be satisfied by the exception + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. + + A constraint to be satisfied by the exception + A TestDelegate + The message that will be displayed on failure + + + + Verifies that a delegate throws a particular exception when called. + + A constraint to be satisfied by the exception + A TestDelegate + + + + Verifies that a delegate throws a particular exception when called. + + The exception Type expected + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. + + The exception Type expected + A TestDelegate + The message that will be displayed on failure + + + + Verifies that a delegate throws a particular exception when called. + + The exception Type expected + A TestDelegate + + + + Verifies that a delegate throws a particular exception when called. + + Type of the expected exception + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. + + Type of the expected exception + A TestDelegate + The message that will be displayed on failure + + + + Verifies that a delegate throws a particular exception when called. + + Type of the expected exception + A TestDelegate + + + + Verifies that a delegate throws an exception when called + and returns it. + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception when called + and returns it. + + A TestDelegate + The message that will be displayed on failure + + + + Verifies that a delegate throws an exception when called + and returns it. + + A TestDelegate + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + + + + Verifies that a delegate throws an exception of a certain Type + or one derived from it when called and returns it. + + The expected Exception Type + A TestDelegate + + + + Verifies that a delegate does not throw an exception + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate does not throw an exception. + + A TestDelegate + The message that will be displayed on failure + + + + Verifies that a delegate does not throw an exception. + + A TestDelegate + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display in case of failure + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + The message to display in case of failure + + + + Asserts that a condition is false. If the condition is true the method throws + an . + + The evaluated condition + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + + + + Verifies that the object that is passed in is not equal to null + If the object is null then an + is thrown. + + The object that is to be tested + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + The message to display in case of failure + + + + Verifies that the object that is passed in is equal to null + If the object is not null then an + is thrown. + + The object that is to be tested + + + + Verifies that two ints are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two ints are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two ints are equal. If they are not, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two longs are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two longs are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two longs are equal. If they are not, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two unsigned ints are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two unsigned ints are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two unsigned ints are equal. If they are not, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two unsigned longs are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two unsigned longs are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two unsigned longs are equal. If they are not, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two decimals are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two decimals are equal. If they are not, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two decimals are equal. If they are not, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + + + + Verifies that two doubles are equal considering a delta. If the + expected value is infinity then the delta value is ignored. If + they are not equal then an is + thrown. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + + + + Verifies that two objects are equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are not equal an is thrown. + + The value that is expected + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two objects are equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are not equal an is thrown. + + The value that is expected + The actual value + The message to display in case of failure + + + + Verifies that two objects are equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are not equal an is thrown. + + The value that is expected + The actual value + + + + Verifies that two ints are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two ints are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two ints are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two longs are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two longs are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two longs are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two unsigned ints are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two unsigned ints are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two unsigned ints are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two unsigned longs are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two unsigned longs are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two unsigned longs are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two decimals are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two decimals are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two decimals are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two floats are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two floats are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two floats are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two doubles are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two doubles are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + The message to display in case of failure + + + + Verifies that two doubles are not equal. If they are equal, then an + is thrown. + + The expected value + The actual value + + + + Verifies that two objects are not equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are equal an is thrown. + + The value that is expected + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two objects are not equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are equal an is thrown. + + The value that is expected + The actual value + The message to display in case of failure + + + + Verifies that two objects are not equal. Two objects are considered + equal if both are null, or if both have the same value. NUnit + has special semantics for some object types. + If they are equal an is thrown. + + The value that is expected + The actual value + + + + Asserts that two objects refer to the same object. If they + are not the same an is thrown. + + The expected object + The actual object + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that two objects refer to the same object. If they + are not the same an is thrown. + + The expected object + The actual object + The message to display in case of failure + + + + Asserts that two objects refer to the same object. If they + are not the same an is thrown. + + The expected object + The actual object + + + + Asserts that two objects do not refer to the same object. If they + are the same an is thrown. + + The expected object + The actual object + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that two objects do not refer to the same object. If they + are the same an is thrown. + + The expected object + The actual object + The message to display in case of failure + + + + Asserts that two objects do not refer to the same object. If they + are the same an is thrown. + + The expected object + The actual object + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + The message to display in case of failure + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + The message to display in case of failure + + + + Verifies that the double that is passed in is an NaN value. + If the object is not NaN then an + is thrown. + + The value that is to be tested + + + + Assert that a string is empty - that is equal to string.Empty + + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that a string is empty - that is equal to string.Empty + + The string to be tested + The message to display in case of failure + + + + Assert that a string is empty - that is equal to string.Empty + + The string to be tested + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing ICollection + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing ICollection + The message to display in case of failure + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing ICollection + + + + Assert that a string is not empty - that is not equal to string.Empty + + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that a string is not empty - that is not equal to string.Empty + + The string to be tested + The message to display in case of failure + + + + Assert that a string is not empty - that is not equal to string.Empty + + The string to be tested + + + + Assert that an array, list or other collection is not empty + + An array, list or other collection implementing ICollection + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that an array, list or other collection is not empty + + An array, list or other collection implementing ICollection + The message to display in case of failure + + + + Assert that an array, list or other collection is not empty + + An array, list or other collection implementing ICollection + + + + Assert that a string is either null or equal to string.Empty + + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that a string is either null or equal to string.Empty + + The string to be tested + The message to display in case of failure + + + + Assert that a string is either null or equal to string.Empty + + The string to be tested + + + + Assert that a string is not null or empty + + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that a string is not null or empty + + The string to be tested + The message to display in case of failure + + + + Assert that a string is not null or empty + + The string to be tested + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + + + + Asserts that an object may be assigned a value of a given Type. + + The expected Type. + The object under examination + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + The message to display in case of failure + + + + Asserts that an object may not be assigned a value of a given Type. + + The expected Type. + The object under examination + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + + + + Asserts that an object is an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + The message to display in case of failure + + + + Asserts that an object is not an instance of a given type. + + The expected Type + The object being examined + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + + + + Verifies that the first value is greater than or equal tothe second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Asserts that an object is contained in a list. + + The expected object + The list to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is contained in a list. + + The expected object + The list to be examined + The message to display in case of failure + + + + Asserts that an object is contained in a list. + + The expected object + The list to be examined + + + + Helper for Assert.AreEqual(double expected, double actual, ...) + allowing code generation to work consistently. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Gets the number of assertions executed so far and + resets the counter to zero. + + + + + AssertionHelper is an optional base class for user tests, + allowing the use of shorter names for constraints and + asserts and avoiding conflict with the definition of + , from which it inherits much of its + behavior, in certain mock object frameworks. + + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. + + + + + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a constraint that tests two items for equality + + + + + Returns a constraint that tests that two references are the same object + + + + + Returns a constraint that tests whether the + actual value is greater than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that fails if the actual + value matches the pattern supplied as an argument. + + + + + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the actual value falls + within a specified range. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. + + + + + Returns a constraint that tests for null + + + + + Returns a constraint that tests for True + + + + + Returns a constraint that tests for False + + + + + Returns a constraint that tests for a positive value + + + + + Returns a constraint that tests for a negative value + + + + + Returns a constraint that tests for NaN + + + + + Returns a constraint that tests for empty + + + + + Returns a constraint that tests whether a collection + contains all unique items. + + + + + Returns a constraint that tests whether an object graph is serializable in binary format. + + + + + Returns a constraint that tests whether an object graph is serializable in xml format. + + + + + Returns a constraint that tests whether a collection is ordered + + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. Works + identically to Assert.That. + + The actual value to test + A Constraint to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. Works + identically to Assert.That. + + The actual value to test + A Constraint to be applied + The message to be displayed in case of failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. Works + identically to Assert.That. + + The actual value to test + A Constraint to be applied + The message to be displayed in case of failure + Arguments to use in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically to + . + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically to + . + + The evaluated condition + The message to display if the condition is false + + + + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically to . + + The evaluated condition + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The actual value to test + A Constraint to be applied + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The actual value to test + A Constraint to be applied + The message that will be displayed on failure + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + The actual value to test + A Constraint to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + + + + Returns a ListMapper based on a collection. + + The original collection + + + + + Provides static methods to express the assumptions + that must be met for a test to give a meaningful + result. If an assumption is not met, the test + should produce an inconclusive result. + + + + + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + The actual value to test + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . + + The evaluated condition + The message to display if the condition is false + + + + Asserts that a condition is true. If the condition is false the + method throws an . + + The evaluated condition + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + The message that will be displayed on failure + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + The actual value to test + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + + + + Apply a constraint to a referenced value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + + + + Waits for pending asynchronous operations to complete, if appropriate, + and returns a proper result of the invocation by unwrapping task results + + The raw result of the method invocation + The unwrapped result, if necessary + + + + A set of Assert methods operationg on one or more collections + + + + + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + Asserts that all items contained in collection are of the type specified by expectedType. + + IEnumerable containing objects to be considered + System.Type that all objects in collection must be instances of + + + + Asserts that all items contained in collection are of the type specified by expectedType. + + IEnumerable containing objects to be considered + System.Type that all objects in collection must be instances of + The message that will be displayed on failure + + + + Asserts that all items contained in collection are of the type specified by expectedType. + + IEnumerable containing objects to be considered + System.Type that all objects in collection must be instances of + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that all items contained in collection are not equal to null. + + IEnumerable containing objects to be considered + + + + Asserts that all items contained in collection are not equal to null. + + IEnumerable containing objects to be considered + The message that will be displayed on failure + + + + Asserts that all items contained in collection are not equal to null. + + IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Ensures that every object contained in collection exists within the collection + once and only once. + + IEnumerable of objects to be considered + + + + Ensures that every object contained in collection exists within the collection + once and only once. + + IEnumerable of objects to be considered + The message that will be displayed on failure + + + + Ensures that every object contained in collection exists within the collection + once and only once. + + IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + + + + Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are not exactly equal. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are not exactly equal. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + + + + Asserts that expected and actual are not exactly equal. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + + + + Asserts that expected and actual are not exactly equal. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure + + + + Asserts that expected and actual are not exactly equal. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are not exactly equal. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are not equivalent. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are not equivalent. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + + + + Asserts that expected and actual are not equivalent. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that collection contains actual as an item. + + IEnumerable of objects to be considered + Object to be found within collection + + + + Asserts that collection contains actual as an item. + + IEnumerable of objects to be considered + Object to be found within collection + The message that will be displayed on failure + + + + Asserts that collection contains actual as an item. + + IEnumerable of objects to be considered + Object to be found within collection + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that collection does not contain actual as an item. + + IEnumerable of objects to be considered + Object that cannot exist within collection + + + + Asserts that collection does not contain actual as an item. + + IEnumerable of objects to be considered + Object that cannot exist within collection + The message that will be displayed on failure + + + + Asserts that collection does not contain actual as an item. + + IEnumerable of objects to be considered + Object that cannot exist within collection + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that superset is not a subject of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + + + + Asserts that superset is not a subject of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + + + + Asserts that superset is not a subject of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that superset is a subset of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + + + + Asserts that superset is a subset of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + + + + Asserts that superset is a subset of subset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + + + + Assert that an array,list or other collection is empty + + An array, list or other collection implementing IEnumerable + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + + + + Assert that an array,list or other collection is empty + + An array, list or other collection implementing IEnumerable + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + A custom comparer to perform the comparisons + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + A custom comparer to perform the comparisons + The message to be displayed on failure + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + A custom comparer to perform the comparisons + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Summary description for DirectoryAssert + + + + + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + We don't actually want any instances of this object, but some people + like to inherit from it to add other static methods. Hence, the + protected constructor disallows any instances of this object. + + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + The message to display if directories are not equal + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + The message to display if directories are equal + Arguments to be used in formatting the message + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + The message to display if directories are equal + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory path string containing the value that is expected + A directory path string containing the actual value + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + The message to display if directories are not equal + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + The message to display if directories are not equal + + + + Asserts that the directory is empty. If it is not empty + an is thrown. + + A directory to search + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + The message to display if directories are not equal + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + The message to display if directories are not equal + + + + Asserts that the directory is not empty. If it is empty + an is thrown. + + A directory to search + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + Arguments to be used in formatting the message + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + Arguments to be used in formatting the message + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + + + + Asserts that path contains actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + Arguments to be used in formatting the message + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + Arguments to be used in formatting the message + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + The message to display if directory is not within the path + + + + Asserts that path does not contain actual as a subdirectory or + an is thrown. + + A directory to search + sub-directory asserted to exist under directory + + + + Summary description for FileAssert. + + + + + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + We don't actually want any instances of this object, but some people + like to inherit from it to add other static methods. Hence, the + protected constructor disallows any instances of this object. + + + + + Verifies that two Streams are equal. Two Streams are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The expected Stream + The actual Stream + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Verifies that two Streams are equal. Two Streams are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The expected Stream + The actual Stream + The message to display if objects are not equal + + + + Verifies that two Streams are equal. Two Streams are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The expected Stream + The actual Stream + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A file containing the value that is expected + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A file containing the value that is expected + A file containing the actual value + The message to display if objects are not equal + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A file containing the value that is expected + A file containing the actual value + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if objects are not equal + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + + + + Asserts that two Streams are not equal. If they are equal + an is thrown. + + The expected Stream + The actual Stream + The message to be displayed when the two Stream are the same. + Arguments to be used in formatting the message + + + + Asserts that two Streams are not equal. If they are equal + an is thrown. + + The expected Stream + The actual Stream + The message to be displayed when the Streams are the same. + + + + Asserts that two Streams are not equal. If they are equal + an is thrown. + + The expected Stream + The actual Stream + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + A file containing the value that is expected + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + A file containing the value that is expected + A file containing the actual value + The message to display if objects are not equal + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + A file containing the value that is expected + A file containing the actual value + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if objects are not equal + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + + + + GlobalSettings is a place for setting default values used + by the framework in performing asserts. + + + + + Default tolerance for floating point equality + + + + + Class used to guard against unexpected argument values + by throwing an appropriate exception. + + + + + Throws an exception if an argument is null + + The value to be tested + The name of the argument + + + + Throws an exception if a string argument is null or empty + + The value to be tested + The name of the argument + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. + + + + + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. + + + + + Interface implemented by a user fixture in order to + validate any expected exceptions. It is only called + for test methods marked with the ExpectedException + attribute. + + + + + Method to handle an expected exception + + The exception to be handled + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a constraint that tests two items for equality + + + + + Returns a constraint that tests that two references are the same object + + + + + Returns a constraint that tests whether the + actual value is greater than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the actual value falls + within a specified range. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a constraint that tests for null + + + + + Returns a constraint that tests for True + + + + + Returns a constraint that tests for False + + + + + Returns a constraint that tests for a positive value + + + + + Returns a constraint that tests for a negative value + + + + + Returns a constraint that tests for NaN + + + + + Returns a constraint that tests for empty + + + + + Returns a constraint that tests whether a collection + contains all unique items. + + + + + Returns a constraint that tests whether an object graph is serializable in binary format. + + + + + Returns a constraint that tests whether an object graph is serializable in xml format. + + + + + Returns a constraint that tests whether a collection is ordered + + + + + The ITestCaseData interface is implemented by a class + that is able to return complete testcases for use by + a parameterized test method. + + NOTE: This interface is used in both the framework + and the core, even though that results in two different + types. However, sharing the source code guarantees that + the various implementations will be compatible and that + the core is able to reflect successfully over the + framework implementations of ITestCaseData. + + + + + Gets the argument list to be provided to the test + + + + + Gets the expected result + + + + + Indicates whether a result has been specified. + This is necessary because the result may be + null, so it's value cannot be checked. + + + + + Gets the expected exception Type + + + + + Gets the FullName of the expected exception + + + + + Gets the name to be used for the test + + + + + Gets the description of the test + + + + + Gets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets a value indicating whether this is explicit. + + true if explicit; otherwise, false. + + + + Gets the ignore reason. + + The ignore reason. + + + + The Iz class is a synonym for Is intended for use in VB, + which regards Is as a keyword. + + + + + The List class is a helper class with properties and methods + that supply a number of constraints used with lists and collections. + + + + + List.Map returns a ListMapper, which can be used to map + the original collection to another collection. + + + + + + + ListMapper is used to transform a collection used as an actual argument + producing another collection to be used in the assertion. + + + + + Construct a ListMapper based on a collection + + The collection to be transformed + + + + Produces a collection containing all the values of a property + + The collection of property values + + + + + Randomizer returns a set of random values in a repeatable + way, to allow re-running of tests if necessary. + + + + + Get a randomizer for a particular member, returning + one that has already been created if it exists. + This ensures that the same values are generated + each time the tests are reloaded. + + + + + Get a randomizer for a particular parameter, returning + one that has already been created if it exists. + This ensures that the same values are generated + each time the tests are reloaded. + + + + + Construct a randomizer using a random seed + + + + + Construct a randomizer using a specified seed + + + + + Return an array of random doubles between 0.0 and 1.0. + + + + + + + Return an array of random doubles with values in a specified range. + + + + + Return an array of random ints with values in a specified range. + + + + + Get a random seed for use in creating a randomizer. + + + + + The SpecialValue enum is used to represent TestCase arguments + that cannot be used as arguments to an Attribute. + + + + + Null represents a null value, which cannot be used as an + argument to an attribute under .NET 1.x + + + + + Basic Asserts on strings. + + + + + The Equals method throws an AssertionException. This is done + to make sure there is no mistake by calling this function. + + + + + + + override the default ReferenceEquals to throw an AssertionException. This + implementation makes sure there is no mistake in calling this function + as part of Assert. + + + + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + The message to display in case of failure + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + + + + Asserts that a string is not found within another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + The message to display in case of failure + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + + + + Asserts that a string starts with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string starts with another string. + + The expected string + The string to be examined + The message to display in case of failure + + + + Asserts that a string starts with another string. + + The expected string + The string to be examined + + + + Asserts that a string does not start with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string does not start with another string. + + The expected string + The string to be examined + The message to display in case of failure + + + + Asserts that a string does not start with another string. + + The expected string + The string to be examined + + + + Asserts that a string ends with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string ends with another string. + + The expected string + The string to be examined + The message to display in case of failure + + + + Asserts that a string ends with another string. + + The expected string + The string to be examined + + + + Asserts that a string does not end with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string does not end with another string. + + The expected string + The string to be examined + The message to display in case of failure + + + + Asserts that a string does not end with another string. + + The expected string + The string to be examined + + + + Asserts that two strings are equal, without regard to case. + + The expected string + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that two strings are equal, without regard to case. + + The expected string + The actual string + The message to display in case of failure + + + + Asserts that two strings are equal, without regard to case. + + The expected string + The actual string + + + + Asserts that two strings are not equal, without regard to case. + + The expected string + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that two strings are Notequal, without regard to case. + + The expected string + The actual string + The message to display in case of failure + + + + Asserts that two strings are not equal, without regard to case. + + The expected string + The actual string + + + + Asserts that a string matches an expected regular expression pattern. + + The regex pattern to be matched + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string matches an expected regular expression pattern. + + The regex pattern to be matched + The actual string + The message to display in case of failure + + + + Asserts that a string matches an expected regular expression pattern. + + The regex pattern to be matched + The actual string + + + + Asserts that a string does not match an expected regular expression pattern. + + The regex pattern to be used + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string does not match an expected regular expression pattern. + + The regex pattern to be used + The actual string + The message to display in case of failure + + + + Asserts that a string does not match an expected regular expression pattern. + + The regex pattern to be used + The actual string + + + + The TestCaseData class represents a set of arguments + and other parameter info to be used for a parameterized + test case. It provides a number of instance modifiers + for use in initializing the test case. + + Note: Instance modifiers are getters that return + the same instance after modifying it's state. + + + + + The argument list to be provided to the test + + + + + The expected result to be returned + + + + + Set to true if this has an expected result + + + + + The expected exception Type + + + + + The FullName of the expected exception + + + + + The name to be used for the test + + + + + The description of the test + + + + + A dictionary of properties, used to add information + to tests without requiring the class to change. + + + + + If true, indicates that the test case is to be ignored + + + + + If true, indicates that the test case is marked explicit + + + + + The reason for ignoring a test case + + + + + Initializes a new instance of the class. + + The arguments. + + + + Initializes a new instance of the class. + + The argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + The third argument. + + + + Sets the expected result for the test + + The expected result + A modified TestCaseData + + + + Sets the expected exception type for the test + + Type of the expected exception. + The modified TestCaseData instance + + + + Sets the expected exception type for the test + + FullName of the expected exception. + The modified TestCaseData instance + + + + Sets the name of the test case + + The modified TestCaseData instance + + + + Sets the description for the test case + being constructed. + + The description. + The modified TestCaseData instance. + + + + Applies a category to the test + + + + + + + Applies a named property to the test + + + + + + + + Applies a named property to the test + + + + + + + + Applies a named property to the test + + + + + + + + Ignores this TestCase. + + + + + + Ignores this TestCase, specifying the reason. + + The reason. + + + + + Marks this TestCase as Explicit + + + + + + Marks this TestCase as Explicit, specifying the reason. + + The reason. + + + + + Gets the argument list to be provided to the test + + + + + Gets the expected result + + + + + Returns true if the result has been set + + + + + Gets the expected exception Type + + + + + Gets the FullName of the expected exception + + + + + Gets the name to be used for the test + + + + + Gets the description of the test + + + + + Gets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets a value indicating whether this is explicit. + + true if explicit; otherwise, false. + + + + Gets the ignore reason. + + The ignore reason. + + + + Gets a list of categories associated with this test. + + + + + Gets the property dictionary for this test + + + + + Provide the context information of the current test + + + + + Constructs a TestContext using the provided context dictionary + + A context dictionary + + + + Get the current test context. This is created + as needed. The user may save the context for + use within a test, but it should not be used + outside the test for which it is created. + + + + + Gets a TestAdapter representing the currently executing test in this context. + + + + + Gets a ResultAdapter representing the current result for the test + executing in this context. + + + + + Gets the directory containing the current test assembly. + + + + + Gets the directory to be used for outputing files created + by this test run. + + + + + TestAdapter adapts a Test for consumption by + the user test code. + + + + + Constructs a TestAdapter for this context + + The context dictionary + + + + The name of the test. + + + + + The FullName of the test + + + + + The properties of the test. + + + + + ResultAdapter adapts a TestResult for consumption by + the user test code. + + + + + Construct a ResultAdapter for a context + + The context holding the result + + + + The TestState of current test. This maps to the ResultState + used in nunit.core and is subject to change in the future. + + + + + The TestStatus of current test. This enum will be used + in future versions of NUnit and so is to be preferred + to the TestState value. + + + + + Provides details about a test + + + + + Creates an instance of TestDetails + + The fixture that the test is a member of, if available. + The method that implements the test, if available. + The full name of the test. + A string representing the type of test, e.g. "Test Case". + Indicates if the test represents a suite of tests. + + + + The fixture that the test is a member of, if available. + + + + + The method that implements the test, if available. + + + + + The full name of the test. + + + + + A string representing the type of test, e.g. "Test Case". + + + + + Indicates if the test represents a suite of tests. + + + + + The ResultState enum indicates the result of running a test + + + + + The result is inconclusive + + + + + The test was not runnable. + + + + + The test has been skipped. + + + + + The test has been ignored. + + + + + The test succeeded + + + + + The test failed + + + + + The test encountered an unexpected exception + + + + + The test was cancelled by the user + + + + + The TestStatus enum indicates the result of running a test + + + + + The test was inconclusive + + + + + The test has skipped + + + + + The test succeeded + + + + + The test failed + + + + + Helper class with static methods used to supply constraints + that operate on strings. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the Regex pattern supplied as an argument. + + + + + Returns a constraint that fails if the actual + value matches the pattern supplied as an argument. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + TextMessageWriter writes constraint descriptions and messages + in displayable form as a text stream. It tailors the display + of individual message components to form the standard message + format of NUnit assertion failure messages. + + + + + MessageWriter is the abstract base for classes that write + constraint descriptions and messages in some form. The + class has separate methods for writing various components + of a message, allowing implementations to tailor the + presentation as needed. + + + + + Construct a MessageWriter given a culture + + + + + Method to write single line message with optional args, usually + written to precede the general failure message. + + The message to be written + Any arguments used in formatting the message + + + + Method to write single line message with optional args, usually + written to precede the general failure message, at a givel + indentation level. + + The indentation level of the message + The message to be written + Any arguments used in formatting the message + + + + Display Expected and Actual lines for a constraint. This + is called by MessageWriter's default implementation of + WriteMessageTo and provides the generic two-line display. + + The constraint that failed + + + + Display Expected and Actual lines for given values. This + method may be called by constraints that need more control over + the display of actual and expected values than is provided + by the default implementation. + + The expected value + The actual value causing the failure + + + + Display Expected and Actual lines for given values, including + a tolerance value on the Expected line. + + The expected value + The actual value causing the failure + The tolerance within which the test was made + + + + Display the expected and actual string values on separate lines. + If the mismatch parameter is >=0, an additional line is displayed + line containing a caret that points to the mismatch point. + + The expected string value + The actual string value + The point at which the strings don't match or -1 + If true, case is ignored in locating the point where the strings differ + If true, the strings should be clipped to fit the line + + + + Writes the text for a connector. + + The connector. + + + + Writes the text for a predicate. + + The predicate. + + + + Writes the text for an expected value. + + The expected value. + + + + Writes the text for a modifier + + The modifier. + + + + Writes the text for an actual value. + + The actual value. + + + + Writes the text for a generalized value. + + The value. + + + + Writes the text for a collection value, + starting at a particular point, to a max length + + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write + + + + Abstract method to get the max line length + + + + + Prefix used for the expected value line of a message + + + + + Prefix used for the actual value line of a message + + + + + Length of a message prefix + + + + + Construct a TextMessageWriter + + + + + Construct a TextMessageWriter, specifying a user message + and optional formatting arguments. + + + + + + + Method to write single line message with optional args, usually + written to precede the general failure message, at a givel + indentation level. + + The indentation level of the message + The message to be written + Any arguments used in formatting the message + + + + Display Expected and Actual lines for a constraint. This + is called by MessageWriter's default implementation of + WriteMessageTo and provides the generic two-line display. + + The constraint that failed + + + + Display Expected and Actual lines for given values. This + method may be called by constraints that need more control over + the display of actual and expected values than is provided + by the default implementation. + + The expected value + The actual value causing the failure + + + + Display Expected and Actual lines for given values, including + a tolerance value on the expected line. + + The expected value + The actual value causing the failure + The tolerance within which the test was made + + + + Display the expected and actual string values on separate lines. + If the mismatch parameter is >=0, an additional line is displayed + line containing a caret that points to the mismatch point. + + The expected string value + The actual string value + The point at which the strings don't match or -1 + If true, case is ignored in string comparisons + If true, clip the strings to fit the max line length + + + + Writes the text for a connector. + + The connector. + + + + Writes the text for a predicate. + + The predicate. + + + + Write the text for a modifier. + + The modifier. + + + + Writes the text for an expected value. + + The expected value. + + + + Writes the text for an actual value. + + The actual value. + + + + Writes the text for a generalized value. + + The value. + + + + Writes the text for a collection value, + starting at a particular point, to a max length + + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write + + + + Write the generic 'Expected' line for a constraint + + The constraint that failed + + + + Write the generic 'Expected' line for a given value + + The expected value + + + + Write the generic 'Expected' line for a given value + and tolerance. + + The expected value + The tolerance within which the test was made + + + + Write the generic 'Actual' line for a constraint + + The constraint for which the actual value is to be written + + + + Write the generic 'Actual' line for a given value + + The actual value causing a failure + + + + Gets or sets the maximum line length for this writer + + + + + Helper class with properties and methods that supply + constraints that operate on exceptions. + + + + + Creates a constraint specifying the exact type of exception expected + + + + + Creates a constraint specifying the exact type of exception expected + + + + + Creates a constraint specifying the type of exception expected + + + + + Creates a constraint specifying the type of exception expected + + + + + Creates a constraint specifying an expected exception + + + + + Creates a constraint specifying an exception with a given InnerException + + + + + Creates a constraint specifying an expected TargetInvocationException + + + + + Creates a constraint specifying an expected TargetInvocationException + + + + + Creates a constraint specifying an expected TargetInvocationException + + + + + Creates a constraint specifying that no exception is thrown + + + + + Attribute used to apply a category to a test + + + + + The name of the category + + + + + Construct attribute for a given category based on + a name. The name may not contain the characters ',', + '+', '-' or '!'. However, this is not checked in the + constructor since it would cause an error to arise at + as the test was loaded without giving a clear indication + of where the problem is located. The error is handled + in NUnitFramework.cs by marking the test as not + runnable. + + The name of the category + + + + Protected constructor uses the Type name as the name + of the category. + + + + + The name of the category + + + + + Used to mark a field for use as a datapoint when executing a theory + within the same fixture that requires an argument of the field's Type. + + + + + Used to mark an array as containing a set of datapoints to be used + executing a theory within the same fixture that requires an argument + of the Type of the array elements. + + + + + Attribute used to provide descriptive text about a + test case or fixture. + + + + + Construct the attribute + + Text describing the test + + + + Gets the test description + + + + + Enumeration indicating how the expected message parameter is to be used + + + + Expect an exact match + + + Expect a message containing the parameter string + + + Match the regular expression provided as a parameter + + + Expect a message that starts with the parameter string + + + + ExpectedExceptionAttribute + + + + + + Constructor for a non-specific exception + + + + + Constructor for a given type of exception + + The type of the expected exception + + + + Constructor for a given exception name + + The full name of the expected exception + + + + Gets or sets the expected exception type + + + + + Gets or sets the full Type name of the expected exception + + + + + Gets or sets the expected message text + + + + + Gets or sets the user message displayed in case of failure + + + + + Gets or sets the type of match to be performed on the expected message + + + + + Gets the name of a method to be used as an exception handler + + + + + ExplicitAttribute marks a test or test fixture so that it will + only be run if explicitly executed from the gui or command line + or if it is included by use of a filter. The test will not be + run simply because an enclosing suite is run. + + + + + Default constructor + + + + + Constructor with a reason + + The reason test is marked explicit + + + + The reason test is marked explicit + + + + + Attribute used to mark a test that is to be ignored. + Ignored tests result in a warning message when the + tests are run. + + + + + Constructs the attribute without giving a reason + for ignoring the test. + + + + + Constructs the attribute giving a reason for ignoring the test + + The reason for ignoring the test + + + + The reason for ignoring a test + + + + + Abstract base for Attributes that are used to include tests + in the test run based on environmental settings. + + + + + Constructor with no included items specified, for use + with named property syntax. + + + + + Constructor taking one or more included items + + Comma-delimited list of included items + + + + Name of the item that is needed in order for + a test to run. Multiple itemss may be given, + separated by a comma. + + + + + Name of the item to be excluded. Multiple items + may be given, separated by a comma. + + + + + The reason for including or excluding the test + + + + + PlatformAttribute is used to mark a test fixture or an + individual method as applying to a particular platform only. + + + + + Constructor with no platforms specified, for use + with named property syntax. + + + + + Constructor taking one or more platforms + + Comma-deliminted list of platforms + + + + CultureAttribute is used to mark a test fixture or an + individual method as applying to a particular Culture only. + + + + + Constructor with no cultures specified, for use + with named property syntax. + + + + + Constructor taking one or more cultures + + Comma-deliminted list of cultures + + + + Marks a test to use a combinatorial join of any argument data + provided. NUnit will create a test case for every combination of + the arguments provided. This can result in a large number of test + cases and so should be used judiciously. This is the default join + type, so the attribute need not be used except as documentation. + + + + + PropertyAttribute is used to attach information to a test as a name/value pair.. + + + + + Construct a PropertyAttribute with a name and string value + + The name of the property + The property value + + + + Construct a PropertyAttribute with a name and int value + + The name of the property + The property value + + + + Construct a PropertyAttribute with a name and double value + + The name of the property + The property value + + + + Constructor for derived classes that set the + property dictionary directly. + + + + + Constructor for use by derived classes that use the + name of the type as the property name. Derived classes + must ensure that the Type of the property value is + a standard type supported by the BCL. Any custom + types will cause a serialization Exception when + in the client. + + + + + Gets the property dictionary for this attribute + + + + + Default constructor + + + + + Marks a test to use pairwise join of any argument data provided. + NUnit will attempt too excercise every pair of argument values at + least once, using as small a number of test cases as it can. With + only two arguments, this is the same as a combinatorial join. + + + + + Default constructor + + + + + Marks a test to use a sequential join of any argument data + provided. NUnit will use arguements for each parameter in + sequence, generating test cases up to the largest number + of argument values provided and using null for any arguments + for which it runs out of values. Normally, this should be + used with the same number of arguments for each parameter. + + + + + Default constructor + + + + + Summary description for MaxTimeAttribute. + + + + + Construct a MaxTimeAttribute, given a time in milliseconds. + + The maximum elapsed time in milliseconds + + + + RandomAttribute is used to supply a set of random values + to a single parameter of a parameterized test. + + + + + ValuesAttribute is used to provide literal arguments for + an individual parameter of a test. + + + + + Abstract base class for attributes that apply to parameters + and supply data for the parameter. + + + + + Gets the data to be provided to the specified parameter + + + + + The collection of data to be returned. Must + be set by any derived attribute classes. + We use an object[] so that the individual + elements may have their type changed in GetData + if necessary. + + + + + Construct with one argument + + + + + + Construct with two arguments + + + + + + + Construct with three arguments + + + + + + + + Construct with an array of arguments + + + + + + Get the collection of values to be used as arguments + + + + + Construct a set of doubles from 0.0 to 1.0, + specifying only the count. + + + + + + Construct a set of doubles from min to max + + + + + + + + Construct a set of ints from min to max + + + + + + + + Get the collection of values to be used as arguments + + + + + RangeAttribute is used to supply a range of values to an + individual parameter of a parameterized test. + + + + + Construct a range of ints using default step of 1 + + + + + + + Construct a range of ints specifying the step size + + + + + + + + Construct a range of longs + + + + + + + + Construct a range of doubles + + + + + + + + Construct a range of floats + + + + + + + + RepeatAttribute may be applied to test case in order + to run it multiple times. + + + + + Construct a RepeatAttribute + + The number of times to run the test + + + + RequiredAddinAttribute may be used to indicate the names of any addins + that must be present in order to run some or all of the tests in an + assembly. If the addin is not loaded, the entire assembly is marked + as NotRunnable. + + + + + Initializes a new instance of the class. + + The required addin. + + + + Gets the name of required addin. + + The required addin name. + + + + Summary description for SetCultureAttribute. + + + + + Construct given the name of a culture + + + + + + Summary description for SetUICultureAttribute. + + + + + Construct given the name of a culture + + + + + + SetUpAttribute is used in a TestFixture to identify a method + that is called immediately before each test is run. It is + also used in a SetUpFixture to identify the method that is + called once, before any of the subordinate tests are run. + + + + + Attribute used to mark a class that contains one-time SetUp + and/or TearDown methods that apply to all the tests in a + namespace or an assembly. + + + + + Attribute used to mark a static (shared in VB) property + that returns a list of tests. + + + + + Attribute used in a TestFixture to identify a method that is + called immediately after each test is run. It is also used + in a SetUpFixture to identify the method that is called once, + after all subordinate tests have run. In either case, the method + is guaranteed to be called, even if an exception is thrown. + + + + + Provide actions to execute before and after tests. + + + + + When implemented by an attribute, this interface implemented to provide actions to execute before and after tests. + + + + + Executed before each test is run + + Provides details about the test that is going to be run. + + + + Executed after each test is run + + Provides details about the test that has just been run. + + + + Provides the target for the action attribute + + The target for the action attribute + + + + Adding this attribute to a method within a + class makes the method callable from the NUnit test runner. There is a property + called Description which is optional which you can provide a more detailed test + description. This class cannot be inherited. + + + + [TestFixture] + public class Fixture + { + [Test] + public void MethodToTest() + {} + + [Test(Description = "more detailed description")] + publc void TestDescriptionMethod() + {} + } + + + + + + Descriptive text for this test + + + + + TestCaseAttribute is used to mark parameterized test cases + and provide them with their arguments. + + + + + Construct a TestCaseAttribute with a list of arguments. + This constructor is not CLS-Compliant + + + + + + Construct a TestCaseAttribute with a single argument + + + + + + Construct a TestCaseAttribute with a two arguments + + + + + + + Construct a TestCaseAttribute with a three arguments + + + + + + + + Gets the list of arguments to a test case + + + + + Gets or sets the expected result. Use + ExpectedResult by preference. + + The result. + + + + Gets or sets the expected result. + + The result. + + + + Gets a flag indicating whether an expected + result has been set. + + + + + Gets a list of categories associated with this test; + + + + + Gets or sets the category associated with this test. + May be a single category or a comma-separated list. + + + + + Gets or sets the expected exception. + + The expected exception. + + + + Gets or sets the name the expected exception. + + The expected name of the exception. + + + + Gets or sets the expected message of the expected exception + + The expected message of the exception. + + + + Gets or sets the type of match to be performed on the expected message + + + + + Gets or sets the description. + + The description. + + + + Gets or sets the name of the test. + + The name of the test. + + + + Gets or sets the ignored status of the test + + + + + Gets or sets the ignored status of the test + + + + + Gets or sets the explicit status of the test + + + + + Gets or sets the reason for not running the test + + + + + Gets or sets the reason for not running the test. + Set has the side effect of marking the test as ignored. + + The ignore reason. + + + + FactoryAttribute indicates the source to be used to + provide test cases for a test method. + + + + + Construct with the name of the data source, which must + be a property, field or method of the test class itself. + + An array of the names of the factories that will provide data + + + + Construct with a Type, which must implement IEnumerable + + The Type that will provide data + + + + Construct with a Type and name. + that don't support params arrays. + + The Type that will provide data + The name of the method, property or field that will provide data + + + + The name of a the method, property or fiend to be used as a source + + + + + A Type to be used as a source + + + + + Gets or sets the category associated with this test. + May be a single category or a comma-separated list. + + + + + [TestFixture] + public class ExampleClass + {} + + + + + Default constructor + + + + + Construct with a object[] representing a set of arguments. + In .NET 2.0, the arguments may later be separated into + type arguments and constructor arguments. + + + + + + Descriptive text for this fixture + + + + + Gets and sets the category for this fixture. + May be a comma-separated list of categories. + + + + + Gets a list of categories for this fixture + + + + + The arguments originally provided to the attribute + + + + + Gets or sets a value indicating whether this should be ignored. + + true if ignore; otherwise, false. + + + + Gets or sets the ignore reason. May set Ignored as a side effect. + + The ignore reason. + + + + Get or set the type arguments. If not set + explicitly, any leading arguments that are + Types are taken as type arguments. + + + + + Attribute used to identify a method that is + called before any tests in a fixture are run. + + + + + Attribute used to identify a method that is called after + all the tests in a fixture have run. The method is + guaranteed to be called, even if an exception is thrown. + + + + + Adding this attribute to a method within a + class makes the method callable from the NUnit test runner. There is a property + called Description which is optional which you can provide a more detailed test + description. This class cannot be inherited. + + + + [TestFixture] + public class Fixture + { + [Test] + public void MethodToTest() + {} + + [Test(Description = "more detailed description")] + publc void TestDescriptionMethod() + {} + } + + + + + + Used on a method, marks the test with a timeout value in milliseconds. + The test will be run in a separate thread and is cancelled if the timeout + is exceeded. Used on a method or assembly, sets the default timeout + for all contained test methods. + + + + + Construct a TimeoutAttribute given a time in milliseconds + + The timeout value in milliseconds + + + + Marks a test that must run in the STA, causing it + to run in a separate thread if necessary. + + On methods, you may also use STAThreadAttribute + to serve the same purpose. + + + + + Construct a RequiresSTAAttribute + + + + + Marks a test that must run in the MTA, causing it + to run in a separate thread if necessary. + + On methods, you may also use MTAThreadAttribute + to serve the same purpose. + + + + + Construct a RequiresMTAAttribute + + + + + Marks a test that must run on a separate thread. + + + + + Construct a RequiresThreadAttribute + + + + + Construct a RequiresThreadAttribute, specifying the apartment + + + + + ValueSourceAttribute indicates the source to be used to + provide data for one parameter of a test method. + + + + + Construct with the name of the factory - for use with languages + that don't support params arrays. + + The name of the data source to be used + + + + Construct with a Type and name - for use with languages + that don't support params arrays. + + The Type that will provide data + The name of the method, property or field that will provide data + + + + The name of a the method, property or fiend to be used as a source + + + + + A Type to be used as a source + + + + + AllItemsConstraint applies another constraint to each + item in a collection, succeeding if they all succeed. + + + + + Abstract base class used for prefixes + + + + + The Constraint class is the base of all built-in constraints + within NUnit. It provides the operator overloads used to combine + constraints. + + + + + The IConstraintExpression interface is implemented by all + complete and resolvable constraints and expressions. + + + + + Return the top-level constraint for this expression + + + + + + Static UnsetObject used to detect derived constraints + failing to set the actual value. + + + + + The actual value being tested against a constraint + + + + + The display name of this Constraint for use by ToString() + + + + + Argument fields used by ToString(); + + + + + The builder holding this constraint + + + + + Construct a constraint with no arguments + + + + + Construct a constraint with one argument + + + + + Construct a constraint with two arguments + + + + + Sets the ConstraintBuilder holding this constraint + + + + + Write the failure message to the MessageWriter provided + as an argument. The default implementation simply passes + the constraint and the actual value to the writer, which + then displays the constraint description and the value. + + Constraints that need to provide additional details, + such as where the error occured can override this. + + The MessageWriter on which to display the message + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Test whether the constraint is satisfied by an + ActualValueDelegate that returns the value to be tested. + The default implementation simply evaluates the delegate + but derived classes may override it to provide for delayed + processing. + + An + True for success, false for failure + + + + Test whether the constraint is satisfied by a given reference. + The default implementation simply dereferences the value but + derived classes may override it to provide for delayed processing. + + A reference to the value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + Default override of ToString returns the constraint DisplayName + followed by any arguments within angle brackets. + + + + + + Returns the string representation of this constraint + + + + + This operator creates a constraint that is satisfied only if both + argument constraints are satisfied. + + + + + This operator creates a constraint that is satisfied if either + of the argument constraints is satisfied. + + + + + This operator creates a constraint that is satisfied if the + argument constraint is not satisfied. + + + + + Returns a DelayedConstraint with the specified delay time. + + The delay in milliseconds. + + + + + Returns a DelayedConstraint with the specified delay time + and polling interval. + + The delay in milliseconds. + The interval at which to test the constraint. + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + Returns a ConstraintExpression by appending And + to the current constraint. + + + + + Returns a ConstraintExpression by appending And + to the current constraint. + + + + + Returns a ConstraintExpression by appending Or + to the current constraint. + + + + + Class used to detect any derived constraints + that fail to set the actual value in their + Matches override. + + + + + The base constraint + + + + + Construct given a base constraint + + + + + + Construct an AllItemsConstraint on top of an existing constraint + + + + + + Apply the item constraint to each item in the collection, + failing if any item fails. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + AndConstraint succeeds only if both members succeed. + + + + + BinaryConstraint is the abstract base of all constraints + that combine two other constraints in some fashion. + + + + + The first constraint being combined + + + + + The second constraint being combined + + + + + Construct a BinaryConstraint from two other constraints + + The first constraint + The second constraint + + + + Create an AndConstraint from two other constraints + + The first constraint + The second constraint + + + + Apply both member constraints to an actual value, succeeding + succeeding only if both of them succeed. + + The actual value + True if the constraints both succeeded + + + + Write a description for this contraint to a MessageWriter + + The MessageWriter to receive the description + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + AssignableFromConstraint is used to test that an object + can be assigned from a given Type. + + + + + TypeConstraint is the abstract base for constraints + that take a Type as their expected value. + + + + + The expected Type used by the constraint + + + + + Construct a TypeConstraint for a given Type + + + + + + Write the actual value for a failing constraint test to a + MessageWriter. TypeConstraints override this method to write + the name of the type. + + The writer on which the actual value is displayed + + + + Construct an AssignableFromConstraint for the type provided + + + + + + Test whether an object can be assigned from the specified type + + The object to be tested + True if the object can be assigned a value of the expected Type, otherwise false. + + + + Write a description of this constraint to a MessageWriter + + The MessageWriter to use + + + + AssignableToConstraint is used to test that an object + can be assigned to a given Type. + + + + + Construct an AssignableToConstraint for the type provided + + + + + + Test whether an object can be assigned to the specified type + + The object to be tested + True if the object can be assigned a value of the expected Type, otherwise false. + + + + Write a description of this constraint to a MessageWriter + + The MessageWriter to use + + + + AttributeConstraint tests that a specified attribute is present + on a Type or other provider and that the value of the attribute + satisfies some other constraint. + + + + + Constructs an AttributeConstraint for a specified attriute + Type and base constraint. + + + + + + + Determines whether the Type or other provider has the + expected attribute and if its value matches the + additional constraint specified. + + + + + Writes a description of the attribute to the specified writer. + + + + + Writes the actual value supplied to the specified writer. + + + + + Returns a string representation of the constraint. + + + + + AttributeExistsConstraint tests for the presence of a + specified attribute on a Type. + + + + + Constructs an AttributeExistsConstraint for a specific attribute Type + + + + + + Tests whether the object provides the expected attribute. + + A Type, MethodInfo, or other ICustomAttributeProvider + True if the expected attribute is present, otherwise false + + + + Writes the description of the constraint to the specified writer + + + + + BasicConstraint is the abstract base for constraints that + perform a simple comparison to a constant value. + + + + + Initializes a new instance of the class. + + The expected. + The description. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + BinarySerializableConstraint tests whether + an object is serializable in binary format. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + Returns the string representation + + + + + CollectionConstraint is the abstract base class for + constraints that operate on collections. + + + + + Construct an empty CollectionConstraint + + + + + Construct a CollectionConstraint + + + + + + Determines whether the specified enumerable is empty. + + The enumerable. + + true if the specified enumerable is empty; otherwise, false. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Protected method to be implemented by derived classes + + + + + + + CollectionContainsConstraint is used to test whether a collection + contains an expected object as a member. + + + + + CollectionItemsEqualConstraint is the abstract base class for all + collection constraints that apply some notion of item equality + as a part of their operation. + + + + + Construct an empty CollectionConstraint + + + + + Construct a CollectionConstraint + + + + + + Flag the constraint to use the supplied EqualityAdapter. + NOTE: For internal use only. + + The EqualityAdapter to use. + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied Comparison object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Compares two collection members for equality + + + + + Return a new CollectionTally for use in making tests + + The collection to be included in the tally + + + + Flag the constraint to ignore case and return self. + + + + + Construct a CollectionContainsConstraint + + + + + + Test whether the expected item is contained in the collection + + + + + + + Write a descripton of the constraint to a MessageWriter + + + + + + CollectionEquivalentCOnstraint is used to determine whether two + collections are equivalent. + + + + + Construct a CollectionEquivalentConstraint + + + + + + Test whether two collections are equivalent + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + CollectionOrderedConstraint is used to test whether a collection is ordered. + + + + + Construct a CollectionOrderedConstraint + + + + + Modifies the constraint to use an IComparer and returns self. + + + + + Modifies the constraint to use an IComparer<T> and returns self. + + + + + Modifies the constraint to use a Comparison<T> and returns self. + + + + + Modifies the constraint to test ordering by the value of + a specified property and returns self. + + + + + Test whether the collection is ordered + + + + + + + Write a description of the constraint to a MessageWriter + + + + + + Returns the string representation of the constraint. + + + + + + If used performs a reverse comparison + + + + + CollectionSubsetConstraint is used to determine whether + one collection is a subset of another + + + + + Construct a CollectionSubsetConstraint + + The collection that the actual value is expected to be a subset of + + + + Test whether the actual collection is a subset of + the expected collection provided. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + CollectionTally counts (tallies) the number of + occurences of each object in one or more enumerations. + + + + + Construct a CollectionTally object from a comparer and a collection + + + + + Try to remove an object from the tally + + The object to remove + True if successful, false if the object was not found + + + + Try to remove a set of objects from the tally + + The objects to remove + True if successful, false if any object was not found + + + + The number of objects remaining in the tally + + + + + ComparisonAdapter class centralizes all comparisons of + values in NUnit, adapting to the use of any provided + IComparer, IComparer<T> or Comparison<T> + + + + + Returns a ComparisonAdapter that wraps an IComparer + + + + + Returns a ComparisonAdapter that wraps an IComparer<T> + + + + + Returns a ComparisonAdapter that wraps a Comparison<T> + + + + + Compares two objects + + + + + Gets the default ComparisonAdapter, which wraps an + NUnitComparer object. + + + + + Construct a ComparisonAdapter for an IComparer + + + + + Compares two objects + + + + + + + + Construct a default ComparisonAdapter + + + + + ComparisonAdapter<T> extends ComparisonAdapter and + allows use of an IComparer<T> or Comparison<T> + to actually perform the comparison. + + + + + Construct a ComparisonAdapter for an IComparer<T> + + + + + Compare a Type T to an object + + + + + Construct a ComparisonAdapter for a Comparison<T> + + + + + Compare a Type T to an object + + + + + Abstract base class for constraints that compare values to + determine if one is greater than, equal to or less than + the other. This class supplies the Using modifiers. + + + + + ComparisonAdapter to be used in making the comparison + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Modifies the constraint to use an IComparer and returns self + + + + + Modifies the constraint to use an IComparer<T> and returns self + + + + + Modifies the constraint to use a Comparison<T> and returns self + + + + + Delegate used to delay evaluation of the actual value + to be used in evaluating a constraint + + + + + ConstraintBuilder maintains the stacks that are used in + processing a ConstraintExpression. An OperatorStack + is used to hold operators that are waiting for their + operands to be reognized. a ConstraintStack holds + input constraints as well as the results of each + operator applied. + + + + + Initializes a new instance of the class. + + + + + Appends the specified operator to the expression by first + reducing the operator stack and then pushing the new + operator on the stack. + + The operator to push. + + + + Appends the specified constraint to the expresson by pushing + it on the constraint stack. + + The constraint to push. + + + + Sets the top operator right context. + + The right context. + + + + Reduces the operator stack until the topmost item + precedence is greater than or equal to the target precedence. + + The target precedence. + + + + Resolves this instance, returning a Constraint. If the builder + is not currently in a resolvable state, an exception is thrown. + + The resolved constraint + + + + Gets a value indicating whether this instance is resolvable. + + + true if this instance is resolvable; otherwise, false. + + + + + OperatorStack is a type-safe stack for holding ConstraintOperators + + + + + Initializes a new instance of the class. + + The builder. + + + + Pushes the specified operator onto the stack. + + The op. + + + + Pops the topmost operator from the stack. + + + + + + Gets a value indicating whether this is empty. + + true if empty; otherwise, false. + + + + Gets the topmost operator without modifying the stack. + + The top. + + + + ConstraintStack is a type-safe stack for holding Constraints + + + + + Initializes a new instance of the class. + + The builder. + + + + Pushes the specified constraint. As a side effect, + the constraint's builder field is set to the + ConstraintBuilder owning this stack. + + The constraint. + + + + Pops this topmost constrait from the stack. + As a side effect, the constraint's builder + field is set to null. + + + + + + Gets a value indicating whether this is empty. + + true if empty; otherwise, false. + + + + Gets the topmost constraint without modifying the stack. + + The topmost constraint + + + + ConstraintExpression represents a compound constraint in the + process of being constructed from a series of syntactic elements. + + Individual elements are appended to the expression as they are + reognized. Once an actual Constraint is appended, the expression + returns a resolvable Constraint. + + + + + ConstraintExpressionBase is the abstract base class for the + ConstraintExpression class, which represents a + compound constraint in the process of being constructed + from a series of syntactic elements. + + NOTE: ConstraintExpressionBase is separate because the + ConstraintExpression class was generated in earlier + versions of NUnit. The two classes may be combined + in a future version. + + + + + The ConstraintBuilder holding the elements recognized so far + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the + class passing in a ConstraintBuilder, which may be pre-populated. + + The builder. + + + + Returns a string representation of the expression as it + currently stands. This should only be used for testing, + since it has the side-effect of resolving the expression. + + + + + + Appends an operator to the expression and returns the + resulting expression itself. + + + + + Appends a self-resolving operator to the expression and + returns a new ResolvableConstraintExpression. + + + + + Appends a constraint to the expression and returns that + constraint, which is associated with the current state + of the expression being built. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the + class passing in a ConstraintBuilder, which may be pre-populated. + + The builder. + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. + + + + + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns the constraint provided as an argument - used to allow custom + custom constraints to easily participate in the syntax. + + + + + Returns the constraint provided as an argument - used to allow custom + custom constraints to easily participate in the syntax. + + + + + Returns a constraint that tests two items for equality + + + + + Returns a constraint that tests that two references are the same object + + + + + Returns a constraint that tests whether the + actual value is greater than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the suppled argument + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new CollectionContainsConstraint checking for the + presence of a particular object in the collection. + + + + + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the actual value falls + within a specified range. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. + + + + + With is currently a NOP - reserved for future use. + + + + + Returns a constraint that tests for null + + + + + Returns a constraint that tests for True + + + + + Returns a constraint that tests for False + + + + + Returns a constraint that tests for a positive value + + + + + Returns a constraint that tests for a negative value + + + + + Returns a constraint that tests for NaN + + + + + Returns a constraint that tests for empty + + + + + Returns a constraint that tests whether a collection + contains all unique items. + + + + + Returns a constraint that tests whether an object graph is serializable in binary format. + + + + + Returns a constraint that tests whether an object graph is serializable in xml format. + + + + + Returns a constraint that tests whether a collection is ordered + + + + + ContainsConstraint tests a whether a string contains a substring + or a collection contains an object. It postpones the decision of + which test to use until the type of the actual argument is known. + This allows testing whether a string is contained in a collection + or as a substring of another string using the same syntax. + + + + + Initializes a new instance of the class. + + The expected. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied Comparison object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to ignore case and return self. + + + + + Applies a delay to the match so that a match can be evaluated in the future. + + + + + Creates a new DelayedConstraint + + The inner constraint two decorate + The time interval after which the match is performed + If the value of is less than 0 + + + + Creates a new DelayedConstraint + + The inner constraint two decorate + The time interval after which the match is performed + The time interval used for polling + If the value of is less than 0 + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for if the base constraint fails, false if it succeeds + + + + Test whether the constraint is satisfied by a delegate + + The delegate whose value is to be tested + True for if the base constraint fails, false if it succeeds + + + + Test whether the constraint is satisfied by a given reference. + Overridden to wait for the specified delay period before + calling the base constraint with the dereferenced value. + + A reference to the value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a MessageWriter. + + The writer on which the actual value is displayed + + + + Returns the string representation of the constraint. + + + + + EmptyCollectionConstraint tests whether a collection is empty. + + + + + Check that the collection is empty + + + + + + + Write the constraint description to a MessageWriter + + + + + + EmptyConstraint tests a whether a string or collection is empty, + postponing the decision about which test is applied until the + type of the actual argument is known. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + EmptyDirectoryConstraint is used to test that a directory is empty + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + EmptyStringConstraint tests whether a string is empty. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + EndsWithConstraint can test whether a string ends + with an expected substring. + + + + + StringConstraint is the abstract base for constraints + that operate on strings. It supports the IgnoreCase + modifier for string operations. + + + + + The expected value + + + + + Indicates whether tests should be case-insensitive + + + + + Constructs a StringConstraint given an expected value + + The expected value + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Test whether the constraint is satisfied by a given string + + The string to be tested + True for success, false for failure + + + + Modify the constraint to ignore case in matching. + + + + + Initializes a new instance of the class. + + The expected string + + + + Test whether the constraint is matched by the actual value. + This is a template method, which calls the IsMatch method + of the derived class. + + + + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + EqualConstraint is able to compare an actual value with the + expected value provided in its constructor. Two objects are + considered equal if both are null, or if both have the same + value. NUnit has special semantics for some object types. + + + + + If true, strings in error messages will be clipped + + + + + NUnitEqualityComparer used to test equality. + + + + + Initializes a new instance of the class. + + The expected value. + + + + Flag the constraint to use a tolerance when determining equality. + + Tolerance value to be used + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied Comparison object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write a failure message. Overridden to provide custom + failure messages for EqualConstraint. + + The MessageWriter to write to + + + + Write description of this constraint + + The MessageWriter to write to + + + + Display the failure information for two collections that did not match. + + The MessageWriter on which to display + The expected collection. + The actual collection + The depth of this failure in a set of nested collections + + + + Displays a single line showing the types and sizes of the expected + and actual enumerations, collections or arrays. If both are identical, + the value is only shown once. + + The MessageWriter on which to display + The expected collection or array + The actual collection or array + The indentation level for the message line + + + + Displays a single line showing the point in the expected and actual + arrays at which the comparison failed. If the arrays have different + structures or dimensions, both values are shown. + + The MessageWriter on which to display + The expected array + The actual array + Index of the failure point in the underlying collections + The indentation level for the message line + + + + Display the failure information for two IEnumerables that did not match. + + The MessageWriter on which to display + The expected enumeration. + The actual enumeration + The depth of this failure in a set of nested collections + + + + Flag the constraint to ignore case and return self. + + + + + Flag the constraint to suppress string clipping + and return self. + + + + + Flag the constraint to compare arrays as collections + and return self. + + + + + Switches the .Within() modifier to interpret its tolerance as + a distance in representable values (see remarks). + + Self. + + Ulp stands for "unit in the last place" and describes the minimum + amount a given value can change. For any integers, an ulp is 1 whole + digit. For floating point values, the accuracy of which is better + for smaller numbers and worse for larger numbers, an ulp depends + on the size of the number. Using ulps for comparison of floating + point results instead of fixed tolerances is safer because it will + automatically compensate for the added inaccuracy of larger numbers. + + + + + Switches the .Within() modifier to interpret its tolerance as + a percentage that the actual values is allowed to deviate from + the expected value. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in days. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in hours. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in minutes. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in seconds. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in milliseconds. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in clock ticks. + + Self + + + + EqualityAdapter class handles all equality comparisons + that use an IEqualityComparer, IEqualityComparer<T> + or a ComparisonAdapter. + + + + + Compares two objects, returning true if they are equal + + + + + Returns true if the two objects can be compared by this adapter. + The base adapter cannot handle IEnumerables except for strings. + + + + + Returns an EqualityAdapter that wraps an IComparer. + + + + + Returns an EqualityAdapter that wraps an IEqualityComparer. + + + + + Returns an EqualityAdapter that wraps an IEqualityComparer<T>. + + + + + Returns an EqualityAdapter that wraps an IComparer<T>. + + + + + Returns an EqualityAdapter that wraps a Comparison<T>. + + + + + EqualityAdapter that wraps an IComparer. + + + + + Returns true if the two objects can be compared by this adapter. + Generic adapter requires objects of the specified type. + + + + + EqualityAdapter that wraps an IComparer. + + + + + EqualityAdapterList represents a list of EqualityAdapters + in a common class across platforms. + + + + + ExactCountConstraint applies another constraint to each + item in a collection, succeeding only if a specified + number of items succeed. + + + + + Construct an ExactCountConstraint on top of an existing constraint + + + + + + + Apply the item constraint to each item in the collection, + succeeding only if the expected number of items pass. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + ExactTypeConstraint is used to test that an object + is of the exact type provided in the constructor + + + + + Construct an ExactTypeConstraint for a given Type + + The expected Type. + + + + Test that an object is of the exact type specified + + The actual value. + True if the tested object is of the exact type provided, otherwise false. + + + + Write the description of this constraint to a MessageWriter + + The MessageWriter to use + + + + ExceptionTypeConstraint is a special version of ExactTypeConstraint + used to provided detailed info about the exception thrown in + an error message. + + + + + Constructs an ExceptionTypeConstraint + + + + + Write the actual value for a failing constraint test to a + MessageWriter. Overriden to write additional information + in the case of an Exception. + + The MessageWriter to use + + + + FailurePoint class represents one point of failure + in an equality test. + + + + + The location of the failure + + + + + The expected value + + + + + The actual value + + + + + Indicates whether the expected value is valid + + + + + Indicates whether the actual value is valid + + + + + FailurePointList represents a set of FailurePoints + in a cross-platform way. + + + + + FalseConstraint tests that the actual value is false + + + + + Initializes a new instance of the class. + + + + Helper routines for working with floating point numbers + + + The floating point comparison code is based on this excellent article: + http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm + + + "ULP" means Unit in the Last Place and in the context of this library refers to + the distance between two adjacent floating point numbers. IEEE floating point + numbers can only represent a finite subset of natural numbers, with greater + accuracy for smaller numbers and lower accuracy for very large numbers. + + + If a comparison is allowed "2 ulps" of deviation, that means the values are + allowed to deviate by up to 2 adjacent floating point values, which might be + as low as 0.0000001 for small numbers or as high as 10.0 for large numbers. + + + + + Compares two floating point values for equality + First floating point value to be compared + Second floating point value t be compared + + Maximum number of representable floating point values that are allowed to + be between the left and the right floating point values + + True if both numbers are equal or close to being equal + + + Floating point values can only represent a finite subset of natural numbers. + For example, the values 2.00000000 and 2.00000024 can be stored in a float, + but nothing inbetween them. + + + This comparison will count how many possible floating point values are between + the left and the right number. If the number of possible values between both + numbers is less than or equal to maxUlps, then the numbers are considered as + being equal. + + + Implementation partially follows the code outlined here: + http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ + + + + + Compares two double precision floating point values for equality + First double precision floating point value to be compared + Second double precision floating point value t be compared + + Maximum number of representable double precision floating point values that are + allowed to be between the left and the right double precision floating point values + + True if both numbers are equal or close to being equal + + + Double precision floating point values can only represent a limited series of + natural numbers. For example, the values 2.0000000000000000 and 2.0000000000000004 + can be stored in a double, but nothing inbetween them. + + + This comparison will count how many possible double precision floating point + values are between the left and the right number. If the number of possible + values between both numbers is less than or equal to maxUlps, then the numbers + are considered as being equal. + + + Implementation partially follows the code outlined here: + http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ + + + + + + Reinterprets the memory contents of a floating point value as an integer value + + + Floating point value whose memory contents to reinterpret + + + The memory contents of the floating point value interpreted as an integer + + + + + Reinterprets the memory contents of a double precision floating point + value as an integer value + + + Double precision floating point value whose memory contents to reinterpret + + + The memory contents of the double precision floating point value + interpreted as an integer + + + + + Reinterprets the memory contents of an integer as a floating point value + + Integer value whose memory contents to reinterpret + + The memory contents of the integer value interpreted as a floating point value + + + + + Reinterprets the memory contents of an integer value as a double precision + floating point value + + Integer whose memory contents to reinterpret + + The memory contents of the integer interpreted as a double precision + floating point value + + + + Union of a floating point variable and an integer + + + The union's value as a floating point variable + + + The union's value as an integer + + + The union's value as an unsigned integer + + + Union of a double precision floating point variable and a long + + + The union's value as a double precision floating point variable + + + The union's value as a long + + + The union's value as an unsigned long + + + + Tests whether a value is greater than the value supplied to its constructor + + + + + The value against which a comparison is to be made + + + + + Initializes a new instance of the class. + + The expected value. + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Tests whether a value is greater than or equal to the value supplied to its constructor + + + + + The value against which a comparison is to be made + + + + + Initializes a new instance of the class. + + The expected value. + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + InstanceOfTypeConstraint is used to test that an object + is of the same type provided or derived from it. + + + + + Construct an InstanceOfTypeConstraint for the type provided + + The expected Type + + + + Test whether an object is of the specified type or a derived type + + The object to be tested + True if the object is of the provided type or derives from it, otherwise false. + + + + Write a description of this constraint to a MessageWriter + + The MessageWriter to use + + + + Tests whether a value is less than the value supplied to its constructor + + + + + The value against which a comparison is to be made + + + + + Initializes a new instance of the class. + + The expected value. + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Tests whether a value is less than or equal to the value supplied to its constructor + + + + + The value against which a comparison is to be made + + + + + Initializes a new instance of the class. + + The expected value. + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Static methods used in creating messages + + + + + Static string used when strings are clipped + + + + + Returns the representation of a type as used in NUnitLite. + This is the same as Type.ToString() except for arrays, + which are displayed with their declared sizes. + + + + + + + Converts any control characters in a string + to their escaped representation. + + The string to be converted + The converted string + + + + Return the a string representation for a set of indices into an array + + Array of indices for which a string is needed + + + + Get an array of indices representing the point in a enumerable, + collection or array corresponding to a single int index into the + collection. + + The collection to which the indices apply + Index in the collection + Array of indices + + + + Clip a string to a given length, starting at a particular offset, returning the clipped + string with ellipses representing the removed parts + + The string to be clipped + The maximum permitted length of the result string + The point at which to start clipping + The clipped string + + + + Clip the expected and actual strings in a coordinated fashion, + so that they may be displayed together. + + + + + + + + + Shows the position two strings start to differ. Comparison + starts at the start index. + + The expected string + The actual string + The index in the strings at which comparison should start + Boolean indicating whether case should be ignored + -1 if no mismatch found, or the index where mismatch found + + + + NaNConstraint tests that the actual value is a double or float NaN + + + + + Test that the actual value is an NaN + + + + + + + Write the constraint description to a specified writer + + + + + + NoItemConstraint applies another constraint to each + item in a collection, failing if any of them succeeds. + + + + + Construct a NoItemConstraint on top of an existing constraint + + + + + + Apply the item constraint to each item in the collection, + failing if any item fails. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + NotConstraint negates the effect of some other constraint + + + + + Initializes a new instance of the class. + + The base constraint to be negated. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for if the base constraint fails, false if it succeeds + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a MessageWriter. + + The writer on which the actual value is displayed + + + + NullConstraint tests that the actual value is null + + + + + Initializes a new instance of the class. + + + + + NullEmptyStringConstraint tests whether a string is either null or empty. + + + + + Constructs a new NullOrEmptyStringConstraint + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + The Numerics class contains common operations on numeric values. + + + + + Checks the type of the object, returning true if + the object is a numeric type. + + The object to check + true if the object is a numeric type + + + + Checks the type of the object, returning true if + the object is a floating point numeric type. + + The object to check + true if the object is a floating point numeric type + + + + Checks the type of the object, returning true if + the object is a fixed point numeric type. + + The object to check + true if the object is a fixed point numeric type + + + + Test two numeric values for equality, performing the usual numeric + conversions and using a provided or default tolerance. If the tolerance + provided is Empty, this method may set it to a default tolerance. + + The expected value + The actual value + A reference to the tolerance in effect + True if the values are equal + + + + Compare two numeric values, performing the usual numeric conversions. + + The expected value + The actual value + The relationship of the values to each other + + + + NUnitComparer encapsulates NUnit's default behavior + in comparing two objects. + + + + + Compares two objects + + + + + + + + Returns the default NUnitComparer. + + + + + Generic version of NUnitComparer + + + + + + Compare two objects of the same type + + + + + NUnitEqualityComparer encapsulates NUnit's handling of + equality tests between objects. + + + + + + + + + + Compares two objects for equality within a tolerance + + The first object to compare + The second object to compare + The tolerance to use in the comparison + + + + + If true, all string comparisons will ignore case + + + + + If true, arrays will be treated as collections, allowing + those of different dimensions to be compared + + + + + Comparison objects used in comparisons for some constraints. + + + + + List of points at which a failure occured. + + + + + RecursionDetector used to check for recursion when + evaluating self-referencing enumerables. + + + + + Compares two objects for equality within a tolerance, setting + the tolerance to the actual tolerance used if an empty + tolerance is supplied. + + + + + Helper method to compare two arrays + + + + + Method to compare two DirectoryInfo objects + + first directory to compare + second directory to compare + true if equivalent, false if not + + + + Returns the default NUnitEqualityComparer + + + + + Gets and sets a flag indicating whether case should + be ignored in determining equality. + + + + + Gets and sets a flag indicating that arrays should be + compared as collections, without regard to their shape. + + + + + Gets the list of external comparers to be used to + test for equality. They are applied to members of + collections, in place of NUnit's own logic. + + + + + Gets the list of failure points for the last Match performed. + The list consists of objects to be interpreted by the caller. + This generally means that the caller may only make use of + objects it has placed on the list at a particular depthy. + + + + + RecursionDetector detects when a comparison + between two enumerables has reached a point + where the same objects that were previously + compared are again being compared. This allows + the caller to stop the comparison if desired. + + + + + Check whether two objects have previously + been compared, returning true if they have. + The two objects are remembered, so that a + second call will always return true. + + + + + OrConstraint succeeds if either member succeeds + + + + + Create an OrConstraint from two other constraints + + The first constraint + The second constraint + + + + Apply the member constraints to an actual value, succeeding + succeeding as soon as one of them succeeds. + + The actual value + True if either constraint succeeded + + + + Write a description for this contraint to a MessageWriter + + The MessageWriter to receive the description + + + + PathConstraint serves as the abstract base of constraints + that operate on paths and provides several helper methods. + + + + + The expected path used in the constraint + + + + + Flag indicating whether a caseInsensitive comparison should be made + + + + + Construct a PathConstraint for a give expected path + + The expected path + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Returns true if the expected path and actual path match + + + + + Returns the string representation of this constraint + + + + + Transform the provided path to its canonical form so that it + may be more easily be compared with other paths. + + The original path + The path in canonical form + + + + Test whether one path in canonical form is under another. + + The first path - supposed to be the parent path + The second path - supposed to be the child path + Indicates whether case should be ignored + + + + + Modifies the current instance to be case-insensitve + and returns it. + + + + + Modifies the current instance to be case-sensitve + and returns it. + + + + + Predicate constraint wraps a Predicate in a constraint, + returning success if the predicate is true. + + + + + Construct a PredicateConstraint from a predicate + + + + + Determines whether the predicate succeeds when applied + to the actual value. + + + + + Writes the description to a MessageWriter + + + + + PropertyConstraint extracts a named property and uses + its value as the actual value for a chained constraint. + + + + + Initializes a new instance of the class. + + The name. + The constraint to apply to the property. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + Returns the string representation of the constraint. + + + + + + PropertyExistsConstraint tests that a named property + exists on the object provided through Match. + + Originally, PropertyConstraint provided this feature + in addition to making optional tests on the vaue + of the property. The two constraints are now separate. + + + + + Initializes a new instance of the class. + + The name of the property. + + + + Test whether the property exists for a given object + + The object to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. + + The writer on which the actual value is displayed + + + + Returns the string representation of the constraint. + + + + + + RangeConstraint tests whether two values are within a + specified range. + + + + + Initializes a new instance of the class. + + From. + To. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + RegexConstraint can test whether a string matches + the pattern provided. + + + + + Initializes a new instance of the class. + + The pattern. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + ResolvableConstraintExpression is used to represent a compound + constraint being constructed at a point where the last operator + may either terminate the expression or may have additional + qualifying constraints added to it. + + It is used, for example, for a Property element or for + an Exception element, either of which may be optionally + followed by constraints that apply to the property or + exception. + + + + + Create a new instance of ResolvableConstraintExpression + + + + + Create a new instance of ResolvableConstraintExpression, + passing in a pre-populated ConstraintBuilder. + + + + + Resolve the current expression to a Constraint + + + + + This operator creates a constraint that is satisfied only if both + argument constraints are satisfied. + + + + + This operator creates a constraint that is satisfied only if both + argument constraints are satisfied. + + + + + This operator creates a constraint that is satisfied only if both + argument constraints are satisfied. + + + + + This operator creates a constraint that is satisfied if either + of the argument constraints is satisfied. + + + + + This operator creates a constraint that is satisfied if either + of the argument constraints is satisfied. + + + + + This operator creates a constraint that is satisfied if either + of the argument constraints is satisfied. + + + + + This operator creates a constraint that is satisfied if the + argument constraint is not satisfied. + + + + + Appends an And Operator to the expression + + + + + Appends an Or operator to the expression. + + + + + ReusableConstraint wraps a constraint expression after + resolving it so that it can be reused consistently. + + + + + Construct a ReusableConstraint from a constraint expression + + The expression to be resolved and reused + + + + Converts a constraint to a ReusableConstraint + + The constraint to be converted + A ReusableConstraint + + + + Returns the string representation of the constraint. + + A string representing the constraint + + + + Resolves the ReusableConstraint by returning the constraint + that it originally wrapped. + + A resolved constraint + + + + SameAsConstraint tests whether an object is identical to + the object passed to its constructor + + + + + Initializes a new instance of the class. + + The expected object. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Summary description for SamePathConstraint. + + + + + Initializes a new instance of the class. + + The expected path + + + + Test whether the constraint is satisfied by a given value + + The expected path + The actual path + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + SamePathOrUnderConstraint tests that one path is under another + + + + + Initializes a new instance of the class. + + The expected path + + + + Test whether the constraint is satisfied by a given value + + The expected path + The actual path + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + SomeItemsConstraint applies another constraint to each + item in a collection, succeeding if any of them succeeds. + + + + + Construct a SomeItemsConstraint on top of an existing constraint + + + + + + Apply the item constraint to each item in the collection, + succeeding if any item succeeds. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + StartsWithConstraint can test whether a string starts + with an expected substring. + + + + + Initializes a new instance of the class. + + The expected string + + + + Test whether the constraint is matched by the actual value. + This is a template method, which calls the IsMatch method + of the derived class. + + + + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + SubPathConstraint tests that the actual path is under the expected path + + + + + Initializes a new instance of the class. + + The expected path + + + + Test whether the constraint is satisfied by a given value + + The expected path + The actual path + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + SubstringConstraint can test whether a string contains + the expected substring. + + + + + Initializes a new instance of the class. + + The expected. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + ThrowsConstraint is used to test the exception thrown by + a delegate by applying a constraint to it. + + + + + Initializes a new instance of the class, + using a constraint to be applied to the exception. + + A constraint to apply to the caught exception. + + + + Executes the code of the delegate and captures any exception. + If a non-null base constraint was provided, it applies that + constraint to the exception. + + A delegate representing the code to be tested + True if an exception is thrown and the constraint succeeds, otherwise false + + + + Converts an ActualValueDelegate to a TestDelegate + before calling the primary overload. + + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + Returns the string representation of this constraint + + + + + Get the actual exception thrown - used by Assert.Throws. + + + + + ThrowsNothingConstraint tests that a delegate does not + throw an exception. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True if no exception is thrown, otherwise false + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. Overridden in ThrowsNothingConstraint to write + information about the exception that was actually caught. + + The writer on which the actual value is displayed + + + + The Tolerance class generalizes the notion of a tolerance + within which an equality test succeeds. Normally, it is + used with numeric types, but it can be used with any + type that supports taking a difference between two + objects and comparing that difference to a value. + + + + + Constructs a linear tolerance of a specdified amount + + + + + Constructs a tolerance given an amount and ToleranceMode + + + + + Tests that the current Tolerance is linear with a + numeric value, throwing an exception if it is not. + + + + + Returns an empty Tolerance object, equivalent to + specifying no tolerance. In most cases, it results + in an exact match but for floats and doubles a + default tolerance may be used. + + + + + Returns a zero Tolerance object, equivalent to + specifying an exact match. + + + + + Gets the ToleranceMode for the current Tolerance + + + + + Gets the value of the current Tolerance instance. + + + + + Returns a new tolerance, using the current amount as a percentage. + + + + + Returns a new tolerance, using the current amount in Ulps. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of days. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of hours. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of minutes. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of seconds. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of milliseconds. + + + + + Returns a new tolerance with a TimeSpan as the amount, using + the current amount as a number of clock ticks. + + + + + Returns true if the current tolerance is empty. + + + + + Modes in which the tolerance value for a comparison can be interpreted. + + + + + The tolerance was created with a value, without specifying + how the value would be used. This is used to prevent setting + the mode more than once and is generally changed to Linear + upon execution of the test. + + + + + The tolerance is used as a numeric range within which + two compared values are considered to be equal. + + + + + Interprets the tolerance as the percentage by which + the two compared values my deviate from each other. + + + + + Compares two values based in their distance in + representable numbers. + + + + + TrueConstraint tests that the actual value is true + + + + + Initializes a new instance of the class. + + + + + UniqueItemsConstraint tests whether all the items in a + collection are unique. + + + + + Check that all items are unique. + + + + + + + Write a description of this constraint to a MessageWriter + + + + + + XmlSerializableConstraint tests whether + an object is serializable in XML format. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Write the constraint description to a MessageWriter + + The writer on which the description is displayed + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + Returns the string representation of this constraint + + + + + Represents a constraint that succeeds if all the + members of a collection match a base constraint. + + + + + Abstract base for operators that indicate how to + apply a constraint to items in a collection. + + + + + PrefixOperator takes a single constraint and modifies + it's action in some way. + + + + + The ConstraintOperator class is used internally by a + ConstraintBuilder to represent an operator that + modifies or combines constraints. + + Constraint operators use left and right precedence + values to determine whether the top operator on the + stack should be reduced before pushing a new operator. + + + + + The precedence value used when the operator + is about to be pushed to the stack. + + + + + The precedence value used when the operator + is on the top of the stack. + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + The syntax element preceding this operator + + + + + The syntax element folowing this operator + + + + + The precedence value used when the operator + is about to be pushed to the stack. + + + + + The precedence value used when the operator + is on the top of the stack. + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Returns the constraint created by applying this + prefix to another constraint. + + + + + + + Constructs a CollectionOperator + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + they all succeed. + + + + + Operator that requires both it's arguments to succeed + + + + + Abstract base class for all binary operators + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Abstract method that produces a constraint by applying + the operator to its left and right constraint arguments. + + + + + Gets the left precedence of the operator + + + + + Gets the right precedence of the operator + + + + + Construct an AndOperator + + + + + Apply the operator to produce an AndConstraint + + + + + Operator that tests for the presence of a particular attribute + on a type and optionally applies further tests to the attribute. + + + + + Abstract base class for operators that are able to reduce to a + constraint whether or not another syntactic element follows. + + + + + Construct an AttributeOperator for a particular Type + + The Type of attribute tested + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + Represents a constraint that succeeds if the specified + count of members of a collection match a base constraint. + + + + + Construct an ExactCountOperator for a specified count + + The expected count + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + none of them succeed. + + + + + Represents a constraint that succeeds if none of the + members of a collection match a base constraint. + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + none of them succeed. + + + + + Negates the test of the constraint it wraps. + + + + + Constructs a new NotOperator + + + + + Returns a NotConstraint applied to its argument. + + + + + Operator that requires at least one of it's arguments to succeed + + + + + Construct an OrOperator + + + + + Apply the operator to produce an OrConstraint + + + + + Operator used to test for the presence of a named Property + on an object and optionally apply further tests to the + value of that property. + + + + + Constructs a PropOperator for a particular named property + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Gets the name of the property to which the operator applies + + + + + Represents a constraint that succeeds if any of the + members of a collection match a base constraint. + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + any of them succeed. + + + + + Operator that tests that an exception is thrown and + optionally applies further tests to the exception. + + + + + Construct a ThrowsOperator + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + Represents a constraint that simply wraps the + constraint provided as an argument, without any + further functionality, but which modifes the + order of evaluation because of its precedence. + + + + + Constructor for the WithOperator + + + + + Returns a constraint that wraps its argument + + + + + Thrown when an assertion failed. + + + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Thrown when an assertion failed. + + + + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Thrown when a test executes inconclusively. + + + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Thrown when an assertion failed. + + + + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + + + + + + + Compares two objects of a given Type for equality within a tolerance + + The first object to compare + The second object to compare + The tolerance to use in the comparison + + + + diff --git a/tools/NUnit/launcher.log.conf b/tools/NUnit/launcher.log.conf new file mode 100644 index 00000000..b5bcd9da --- /dev/null +++ b/tools/NUnit/launcher.log.conf @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/tools/NUnit/lib/Images/Ellipsis.gif b/tools/NUnit/lib/Images/Ellipsis.gif new file mode 100644 index 0000000000000000000000000000000000000000..e11f26b6ecf069fa39c7479c6d7ccfb905bc8ad1 GIT binary patch literal 101 zcmZ?wbhEHbKohta7+8cpob+71cLtL}`TaYOI}_99MX)ef0{|!jA?5%8 literal 0 HcmV?d00001 diff --git a/tools/NUnit/lib/Images/Tree/Circles/Failure.jpg b/tools/NUnit/lib/Images/Tree/Circles/Failure.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c245548b91600f0e984c68b8c86a91b176de70cc GIT binary patch literal 761 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3lv=asf&WCF+YYG-#?3t`0{nYJKOS$`>i>3iufO;9-@bbf=coAZ z>#6#9NBHG`hSwV($TPhP$S!#GYl(cCcY#mg#?!k6dnVrCnO}2##@zb+YuA59{H|QH T`nR@sarE=E`TOf9{=W$T56=@C literal 0 HcmV?d00001 diff --git a/tools/NUnit/lib/Images/Tree/Circles/Ignored.jpg b/tools/NUnit/lib/Images/Tree/Circles/Ignored.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0549b70588bccd8adb8fc04a81ba8de6316c9ca4 GIT binary patch literal 688 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3>!guB^J!c9?e?D?>Wxj6uluj{<~#4|`j@%(?Y)R4wWl|;Jo(DP=f?l?y<7Xj rd)_OZO+I+?1e(3sam!QYvBb;Em-boeq+ff#?qB-CteW}C|8D{Sc2oyv literal 0 HcmV?d00001 diff --git a/tools/NUnit/lib/Images/Tree/Circles/Skipped.jpg b/tools/NUnit/lib/Images/Tree/Circles/Skipped.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3d84255ccfed9df405586367652c74f97502f1d9 GIT binary patch literal 689 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3#`Gk*DeytDS`p*NhTR=)COsQ-Tx0Pmadq5uE@ literal 0 HcmV?d00001 diff --git a/tools/NUnit/lib/Images/Tree/Circles/Success.jpg b/tools/NUnit/lib/Images/Tree/Circles/Success.jpg new file mode 100644 index 0000000000000000000000000000000000000000..15ec1b7fbc9257d3638dff3c5819416078c6ff7b GIT binary patch literal 731 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#Lw@(3+VvIHN35nz&0ck`WdGLPx<|T}MVBQ{ zmdyY8Ok(cxRXv&(OiMn<_ms{Tu2}55#Qh}W$4?WO1uWO8y!stK|J42GfAeasBji_n*}CQS R{CRh)KHYy_|8D;On*d5cE201Z literal 0 HcmV?d00001 diff --git a/tools/NUnit/lib/Images/Tree/Classic/Ignored.jpg b/tools/NUnit/lib/Images/Tree/Classic/Ignored.jpg new file mode 100644 index 0000000000000000000000000000000000000000..95b7fdbd142d9de0d244e866a43fb0aef35e43f2 GIT binary patch literal 789 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!+YsL^k~Nr0>4-Or~Wx3Z9y@GGnH*P{@PCDU%pwgy)&m z_~%#5;#;G8?S09#%MwdAIelI%YH?#hQ-s_MzhnOH(uCs#XGvATwdqxV(I_?CIF%499sYY literal 0 HcmV?d00001 diff --git a/tools/NUnit/lib/Images/Tree/Classic/Inconclusive.jpg b/tools/NUnit/lib/Images/Tree/Classic/Inconclusive.jpg new file mode 100644 index 0000000000000000000000000000000000000000..32a0ff72f11713991a178d600e4e6a681a40d0e5 GIT binary patch literal 784 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!<#?Rk9ae`9^G`Q{1~&*p0^WaxR$V`aUIw! zRIqyDyyXm1-3RaKU%7oGe3sfu{rRd}R;<-YcsnsQ=Gf^S(}H`LmQ1ibX!+=R_ZRCI ziC30yY!bdrD+hWC!ca tgD3C!8Be|~`5^q1>!ZD!ch%gvm4CnNceHozl`pz{v0t`-{cQjLCIG3OA^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<ECr+Na zbot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K=Ab&A3Fhjfr_ZgbM1cClyVqsxs zVF&q(k*OSrnFU!`6%E;h90S=C3x$=88aYIqCNA7~kW<+>=!0ld(M2vX6_bamA3#`Gk*DeytDS`p*NhTR=)COsQ-Tx0Pmadq5uE@ literal 0 HcmV?d00001 diff --git a/tools/NUnit/lib/Images/Tree/Classic/Success.jpg b/tools/NUnit/lib/Images/Tree/Classic/Success.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3d8e76092fbea18dda6339c414fbdd675f3386f0 GIT binary patch literal 768 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!@IBl8HDbhuK4zCO+uG(bA!2XMZ`M-{H@Y3`WLF{6BWJzx zMaTzN-v{=r-ivSFII5Fop>x^Z;NZlcrxPakO!Bi%+hb9inKV0h_ugHq_qW}uxj*r9 b!LLup%x;&LZNC|~@9(^6@#Z(>|K9`v$M_Y4 literal 0 HcmV?d00001 diff --git a/tools/NUnit/lib/Images/Tree/Default/Failure.png b/tools/NUnit/lib/Images/Tree/Default/Failure.png new file mode 100644 index 0000000000000000000000000000000000000000..2e400b276fcd227a2f056b4a2c704a3a17776bf2 GIT binary patch literal 1445 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`)E9 z;1l8sRKUo{$jk&pOzh0e>?|xCtgIXy9AX@7f`WolBEl*>9IAX==Hfz@lA;O<3Z|x} z=H}*(GUDEnLVmJhVG{fi(t<7u(jH2(0Sb~Ks&cUk;@+wXk-8eO#(GKWa-pH2$ss|h zp~2Ke@2e>~Y_E0LUi+wv!C_DH6K+N)-Azt;nV<2oIOl71F3|2`ko~DZ zhsz<3S3;eyg}dH}_PiDAeIw52M!etQ;dFk&lg!9x zxiPQH(%x6+%xtKg)mS&HsqSDyX-iAX#EBDU&z?PJ&YbPrx9{1r=fZ^x*REXy2Gl4R zej%{GtG*hT1sF<#{DS|FY`_rwom~|e!<+>kk;T9Q2$?i7*PM82?WL(g zN`WPzD}+VwdMv!tclO`E`;B||X1=U6{T!X0cGlpZ__Dns(^Q{q33<@@B{==%nWLWe zk1k$d-u?gaXS02Y?em%@UT;|X`Le6Q9%a@~-wSg4Dw&gQuTA7S^0aqm1jFsXn`gLK zuT`(x(RJ!s_RG_k0(5hn3;4_C?KACI9eX3|FH6Gy)$UIicifXYyG!~|)yo?vi~jBW z6jT{=a3z2Dp~83PY7E{_76^TyV3HAkJ?rKPx#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy32;bRa{vGi!~g&e!~vBn4jTXf02p*dSaefwW^{L9a%BKeVQFr3 zE>1;MAa*k@Gd8K`;w1n80hLKaK~y+TrBh8y0zm+Mvum1}VRX>a5ECOUFbLEBLWhoa zi6A1VQ-uAUg6QhGTbB;`0YL_C&^3&pvb2=U)oEvKmR)!C(u0NB+4tVOH#%vZdKtPZD3)JARZMl>29Liu3|I&1kTfJPgq+%9OsiJ-toOPO!~H`OqK#nI?@(!6 zqwT>U@y?+aOKW2gMZn{+;qu}G$;FaJA8N3d@u76rQ2qizIPApD)t70VfdNS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`)E9 z;1l8s(!-;v$fu>mr>!iYtt6tUDypL{qOT^Vt0bYJBB8A!rKK*Rt0Qk@EN!c;ps%fD zpr>e}r)s39Zm6$mXsBy!qvh-)o9Lz!=xO8cZ4?%09~ER96Q+?FW|$Ufk(q2+7U~t1 z=2@KXSDY14R#9G2TT@$KU!QH+Sm7{nsr{u{5j$FQC(J5Yy}V@qDzB>xV-BnhxV}E< z#)i-v%af09O1ru(@y_;?I~y}E@65QjJNy2g{QDbfj%}(txux>_&a!K}Dy|)>dfd>^ z(9+z}+uPgU-#@iw?zFaf)22*=ZP=V$w$ot^OV-0Y|Km*2m- z@a@fIuWzh)|6=3yms@T*mXFhFlJ$A(H^yZVhQkhwqa=!#$zBDQ}POMF^Q*x%A)1RPa-{KM&m0#}=i4RPCS&+>>!C^t~!qAdQeH&7owuBmZcyF7% zZ)WnIu7;vLi+5U|2w1SyZCYPoRaxJ(g$ddJ|CjR_noWKjV8CD6W_kCvu1AyiFkkj&ff-?id-yQAc$CUKbKq=bO)z4*}Q$iB}HW4*& literal 0 HcmV?d00001 diff --git a/tools/NUnit/lib/Images/Tree/Default/Skipped.png b/tools/NUnit/lib/Images/Tree/Default/Skipped.png new file mode 100644 index 0000000000000000000000000000000000000000..7c9fc64e3874e15f3f22a234083c1da3ce8d62b8 GIT binary patch literal 1405 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`)E9 z;1l8sRN(9D>+kO$5D*X;7#I{36d4&A6B82~8=H`jker;HmX?;8nVFT9m6MZ`o12@T zpI=Z=P*_-4R8&-4TwGF8Qe9nLQ&Ur0TU%FGS6^S>(9qD>*x1z6)ZEoQeotUc4CddXRJaa_yUX@}NK6`G*Q rap=JLd&hddy85ua{(ro-{sHGx)snNf1MdKfN(Kf`S3j3^P6NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`)E9 z;1l8sRKUo{$iT$F$i&FP&cejS#KytK&dtus&&t8a!79qiDb2|%%gbWKB5xwEsi|pi zZ!hR5DCQ_8m>_8BYiS!{tB|drnWkx$Z|30O;F9a&R^cQtT|ji2DC;^_{!RSCn}wye zOUdq#Rq0dFZPT@#YOA+736d-j|;b5^fjy?y)kzB9co_gm(kXq|kyZOXm=d3UF- zxj1e8wK-eQ%-ni$?$wK1u3ftZ42n@O(n8?#y__;&7GNj|@(cbyvH?TzcXm}^{Bss~ zL>2=JAYg{zy~a2pzj6*xP@=>&q9iy!t)x7$D3u`~F*C13&(AePq0Cs%*lgwVM<9)7 zJY5_^G=h_V^s`AE_`@OZ??1oe|Np)J|Fd&fNJ?d7NlEPTHmYb~z2o!biRe_3R0~Oo zAC63MYDEjzm0f!k!^6X*pexu`^zUIJBcBZq&!IL!2S)kYxVsM~C}^^=74jO(FKAdU zz&yERfxa~J{Kb8}>K+cQQyU%qTN*E3I(bV>4OIj9Z-1nd_^+fC85L>3(lN5 zaNymeob{wrblmH;2j<40nnP d7?&t8Fes)~X?EOwb{gm}22WQ%mvv4FO#qjX@@4=4 literal 0 HcmV?d00001 diff --git a/tools/NUnit/lib/Images/Tree/Visual Studio/Failure.png b/tools/NUnit/lib/Images/Tree/Visual Studio/Failure.png new file mode 100644 index 0000000000000000000000000000000000000000..ba03e84853241e5fbd33f88b5b051a6d8f36e94e GIT binary patch literal 747 zcmV004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00009 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 HBE7x?g(GD~ literal 0 HcmV?d00001 diff --git a/tools/NUnit/lib/Images/unpinned.gif b/tools/NUnit/lib/Images/unpinned.gif new file mode 100644 index 0000000000000000000000000000000000000000..f25fbb53329a37087616ee4e09d933244446ac35 GIT binary patch literal 881 zcmc(eKTFkN6vw}k;57;^h$7OUb#bz#gJ2|bm(&`ZENE=-fbYOj5R9hOrV|a)9Msq< zI4GQM#%)L57@+WW-CQ>paG*TiKa=>_;##+3@4p=gb9~gjQBtjZ2SVI$D5MeXWU<1Z9 z?bLbT^e^#0d{+KWPf5SEHrYM-PiU~GZ?g|}zh7RR4CWqAYrJxGdVl80=HU3(`sv)G zg|A1C&&D5??!3RZfBtIu_3E3$>zkh=ozJgtjczYS&p)jly!`y* + + + NSubstitute + + + + + Argument matchers used for specifying calls to substitutes. + + + + + Match any argument value compatible with type . + + + + + + + Match argument that is equal to . + + + + + + + + Match argument that satisfies . + If the throws an exception for an argument it will be treated as non-matching. + + + + + + + + Invoke any argument as soon as a matching call is made to the substitute. + + + + + + Invoke any argument with specified argument as soon as a matching call is made to the substitute. + + + + + + + + Invoke any argument with specified arguments as soon as a matching call is made to the substitute. + + + + + + + + + + Invoke any argument with specified arguments as soon as a matching call is made to the substitute. + + + + + + + + + + + + Invoke any argument with specified arguments as soon as a matching call is made to the substitute. + + + + + + + + + + + + + + Invoke any argument with specified arguments as soon as a matching call is made to the substitute. + + + Arguments to pass to delegate. + + + + + Capture any argument compatible with type and use it to call the function + as soon as a matching call is made to the substitute. + + + + + + + + Provides a specification for arguments for use with . + Can additionally implement to give descriptions when arguments do not match. + + + + + Checks whether the satisfies the condition of the matcher. + If this throws an exception the argument will be treated as non-matching. + + + + + + + Describes how the does not match the condition specified by this class, or + if a detailed description can not be provided for the argument. + + + Description of the non-match, or if no description can be provided. + + + + Combines two enumerables into a new enumerable using the given selector. + + + + + + + + + + This implementation was sanity-checked against the + Edulinq implementation and + Eric Lippert's implementation. + + + + + Checks if the instance can be used when a is expected. + + + + + + + + Join the using . + + + + + + + + Delegates to ThreadLocal<T>, but wraps Value property access in try/catch to swallow ObjectDisposedExceptions. + These can occur if the Value property is accessed from the finalizer thread. Because we can't detect this, we'll + just swallow the exception (the finalizer thread won't be using any of the values from thread local storage anyway). + + + + + + Provides a specification for arguments for use with . + Can additionally implement to give descriptions when arguments do not match. + + Matches arguments of type or compatible type. + + + + Checks whether the satisfies the condition of the matcher. + If this throws an exception the argument will be treated as non-matching. + + + + + + + Raise an event for an EventHandler<TEventArgs> event with the provided and . + + + + + Raise an event for an EventHandler<TEventArgs> event with the substitute as the sender and the provided . + + + + + Raise an event for an EventHandler<EventArgsT> event with the substitute as the sender + and with a default instance of . + + + + + Raise an event for an EventHandler or EventHandler<EventArgs> event with the substitute + as the sender and with empty EventArgs. + + + + + Raise an event of type with the provided arguments. If no arguments are provided + NSubstitute will try and provide reasonble defaults. + + + + + Create a substitute for one or more types. For example: Substitute.For<ISomeType>() + + + + + Substitute for an interface or class. + Be careful when specifying a class, as all non-virtual members will actually be executed. Only virtual members + can be recorded or have return values specified. + + The type of interface or class to substitute. + Arguments required to construct a class being substituted. Not required for interfaces or classes with default constructors. + A substitute for the interface or class. + + + + Substitute for multiple interfaces or a class that implements an interface. At most one class can be specified. + Be careful when specifying a class, as all non-virtual members will actually be executed. Only virtual members + can be recorded or have return values specified. + + The type of interface or class to substitute. + An additional interface or class (maximum of one class) the substitute should implement. + Arguments required to construct a class being substituted. Not required for interfaces or classes with default constructors. + A substitute of type T1, that also implements T2. + + + + Substitute for multiple interfaces or a class that implements multiple interfaces. At most one class can be specified. + If additional interfaces are required use the overload. + Be careful when specifying a class, as all non-virtual members will actually be executed. Only virtual members + can be recorded or have return values specified. + + The type of interface or class to substitute. + An additional interface or class (maximum of one class) the substitute should implement. + An additional interface or class (maximum of one class) the substitute should implement. + Arguments required to construct a class being substituted. Not required for interfaces or classes with default constructors. + A substitute of type T1, that also implements T2 and T3. + + + + Substitute for multiple interfaces or a class that implements multiple interfaces. At most one class can be specified. + Be careful when specifying a class, as all non-virtual members will actually be executed. Only virtual members + can be recorded or have return values specified. + + The types of interfaces or a type of class and multiple interfaces the substitute should implement. + Arguments required to construct a class being substituted. Not required for interfaces or classes with default constructors. + A substitute implementing the specified types. + + + diff --git a/tools/NUnit/lib/Rhino.Mocks.xml b/tools/NUnit/lib/Rhino.Mocks.xml new file mode 100644 index 00000000..f9b8912b --- /dev/null +++ b/tools/NUnit/lib/Rhino.Mocks.xml @@ -0,0 +1,5413 @@ + + + + Rhino.Mocks + + + + + Defines constraints and return values for arguments of a mock. + Only use Arg inside a method call on a mock that is recording. + Example: + ExpectCall( + mock.foo( + Arg<int>.Is.GreaterThan(2), + Arg<string>.Is.Anything + )); + Use Arg.Text for string specific constraints + Use Arg<ListClass>.List for list specific constraints + + + + + + Register the predicate as a constraint for the current call. + + The predicate. + default(T) + + Allow you to use code to create constraints + + demo.AssertWasCalled(x => x.Bar(Arg{string}.Matches(a => a.StartsWith("b") && a.Contains("ba")))); + + + + + + Define a complex constraint for this argument by passing several constraints + combined with operators. (Use Is in simple cases.) + Example: Arg<string>.Matches(Is.Equal("Hello") || Text.EndsWith("u")); + + Constraints using Is, Text and List + Dummy to satisfy the compiler + + + + Define a Ref argument. + + Constraints for this argument + value returned by the mock + + + + + Define a out parameter. Use it together with the keyword out and use the + Dummy field available by the return value. + Example: mock.foo( out Arg<string>.Out("hello").Dummy ); + + + + + + + Define a simple constraint for this argument. (Use Matches in simple cases.) + Example: + Arg<int>.Is.Anthing + Arg<string>.Is.Equal("hello") + + + + + Define Constraints on list arguments. + + + + + Use the Arg class (without generic) to define Text constraints + + + + + Evaluate an equal constraint for . + + The object the parameter should equal to + + + + Define constraints on text arguments. + + + + + Used to manage the static state of the Arg<T> class"/> + + + + + Resets the static state + + + + + Returns return values for the out and ref parameters + Note: the array returned has the size of the number of out and ref + argument definitions + + + + + + Returns the constraints for all arguments. + Out arguments have an Is.Anything constraint and are also in the list. + + + + + + What should BackToRecord clear + + + + + Retain all expectations and behaviors and return to mock + + + + + All expectations + + + + + Event subscribers for this instance + + + + + Methods that should be forwarded to the base class implementation + + + + + Properties that should behave like properties + + + + + Remove all the behavior of the object + + + + + Interface for constraints + + + + + Determines if the object pass the constraints + + + + + And operator for constraints + + + + + Not operator for constraints + + + + + Or operator for constraints + + + + + Allow overriding of || or && + + + + + + + Allow overriding of || or && + + + + + + + Gets the message for this constraint + + + + + + Constrain that the public field has a specified value + + + + + Constrain that the public field matches another constraint. + + + + + Creates a new instance. + + Name of the public field. + Constraint to place on the public field value. + + + + Creates a new instance, specifying a disambiguating + for the public field. + + The type that declares the public field, used to disambiguate between public fields. + Name of the public field. + Constraint to place on the public field value. + + + + Determines if the object passes the constraint. + + + + + Gets the message for this constraint + + + + + + Creates a new instance. + + Name of the public field. + Expected value. + + + + Creates a new instance, specifying a disambiguating + for the public field. + + The type that declares the public field, used to disambiguate between public fields. + Name of the public field. + Expected value. + + + + Constrain that the property has a specified value + + + + + Constrain that the property matches another constraint. + + + + + Creates a new instance. + + Name of the property. + Constraint to place on the property value. + + + + Creates a new instance, specifying a disambiguating + for the property. + + The type that declares the property, used to disambiguate between properties. + Name of the property. + Constraint to place on the property value. + + + + Determines if the object passes the constraint. + + + + + Gets the message for this constraint + + + + + + Creates a new instance. + + Name of the property. + Expected value. + + + + Creates a new instance, specifying a disambiguating + for the property. + + The type that declares the property, used to disambiguate between properties. + Name of the property. + Expected value. + + + + Constrain that the parameter must be of the specified type + + + + + Creates a new instance. + + Type. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Constraint that determines whether an object is the same object as another. + + + + + Creates a new instance. + + Obj. + + + + Determines if the object passes the constraints. + + + + + Gets the message for this constraint. + + + + + Evaluate a parameter using constraints + + + + + Create new instance + + + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + A constraint based on lambda expression, we are using Expression{T} + because we want to be able to get good error reporting on that. + + + + + Initializes a new instance of the class. + + The expr. + + + + Determines if the object pass the constraints + + + + + + + Gets the message for this constraint + + + + + + Constrain that the list contains the same items as the parameter list + + + + + Creates a new instance. + + In list. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Constrain that the parameter is one of the items in the list + + + + + Creates a new instance. + + In list. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Constrain that the object is inside the parameter list + + + + + Creates a new instance. + + In list. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Applies another AbstractConstraint to the collection count. + + + + + Creates a new instance. + + The constraint that should be applied to the collection count. + + + + Determines if the parameter conforms to this constraint. + + + + + Gets the message for this constraint. + + + + + Applies another AbstractConstraint to a specific list element. + + + + + Creates a new instance. + + The zero-based index of the list element. + The constraint that should be applied to the list element. + + + + Determines if the parameter conforms to this constraint. + + + + + Gets the message for this constraint + + + + + + Applies another AbstractConstraint to a specific generic keyed list element. + + + + + Creates a new instance. + + The key of the list element. + The constraint that should be applied to the list element. + + + + Determines if the parameter conforms to this constraint. + + + + + Gets the message for this constraint + + + + + + Constrains that all elements are in the parameter list + + + + + Initializes a new instance of the class. + + The these. + + + + Determines if the object pass the constraints + + + + + + + Gets the message for this constraint + + + + + + Combines two constraints, constraint pass if either is fine. + + + + + Creates a new instance. + + C1. + C2. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Negate a constraint + + + + + Creates a new instance. + + C1. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Combines two constraints + + + + + + Creates a new instance. + + C1. + C2. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Constrain the argument to validate according to regex pattern + + + + + Creates a new instance. + + Pattern. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Constraint that evaluate whatever an argument contains the specified string. + + + + + Creates a new instance. + + Inner string. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Constraint that evaluate whatever an argument ends with the specified string + + + + + Creates a new instance. + + End. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Constraint that evaluate whatever an argument start with the specified string + + + + + Creates a new instance. + + Start. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Constraint that evaluate whatever an object equals another + + + + + Creates a new instance. + + Obj. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Constraint that always returns true + + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Constraint that evaluate whatever a comparable is greater than another + + + + + Creates a new instance. + + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Initializes a new constraint object. + + The expected object, The actual object is passed in as a parameter to the method + + + + Evaluate this constraint. + + The actual object that was passed in the method call to the mock. + True when the constraint is met, else false. + + + + Checks if the properties of the object + are the same as the properies of the object. + + The expected object + The actual object + True when both objects have the same values, else False. + + + + + + + + + This is the real heart of the beast. + + + + Used by CheckReferenceType to check all properties of the reference type. + + The expected object + The actual object + True when both objects have the same values, else False. + + + + Used by CheckReferenceType to check all fields of the reference type. + + The expected object + The actual object + True when both objects have the same values, else False. + + + + Checks the items of both collections + + The expected collection + + True if both collections contain the same items in the same order. + + + + Builds a propertyname from the Stack _properties like 'Order.Product.Price' + to be used in the error message. + + A nested property name. + + + + Rhino.Mocks uses this property to generate an error message. + + + A message telling the tester why the constraint failed. + + + + + Provides access to the constraintes defined in the class to be used in context + with the syntax. + + The type of the argument + + + + Evaluate a greater than constraint for . + + The object the parameter should be greater than + + + + Evaluate a less than constraint for . + + The object the parameter should be less than + + + + Evaluate a less than or equal constraint for . + + The object the parameter should be less than or equal to + + + + Evaluate a greater than or equal constraint for . + + The object the parameter should be greater than or equal to + + + + Evaluate an equal constraint for . + + The object the parameter should equal to + + + + Evaluate a not equal constraint for . + + The object the parameter should not equal to + + + + Evaluate a same as constraint. + + The object the parameter should the same as. + + + + Evaluate a not same as constraint. + + The object the parameter should not be the same as. + + + + Throws NotSupportedException. Don't use Equals to define constraints. Use Equal instead. + + + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + A constraints that accept anything + + + + + + A constraint that accept only nulls + + + + + + A constraint that accept only non null values + + + + + + A constraint that accept only value of the specified type. + The check is performed on the type that has been defined + as the argument type. + + + + + Provides access to the constraints defined in the class to be used in context + with the syntax. + + + + + Determines whether the specified object is in the parameter. + The parameter must be IEnumerable. + + Obj. + + + + + Determines whatever the parameter is in the collection. + + + + + Determines that the parameter collection is identical to the specified collection + + + + + Determines that the parameter collection has the specified number of elements. + + The constraint that should be applied to the collection count. + + + + Determines that an element of the parameter collections conforms to another AbstractConstraint. + + The zero-based index of the list element. + The constraint which should be applied to the list element. + + + + Determines that all elements of the specified collection are in the the parameter collection + + The collection to compare against + The constraint which should be applied to the list parameter. + + + + Throws NotSupportedException. Don't use Equals to define constraints. Use Equal instead. + + + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Provides a dummy field to pass as out or ref argument. + + + + + + Dummy field to satisfy the compiler. Used for out and ref arguments. + + + + + Central location for constraints for object's public fields + + + + + Constrains the parameter to have a public field with the specified value + + Name of the public field. + Expected value. + + + + + Constrains the parameter to have a public field with the specified value. + + The type that declares the public field, used to disambiguate between public fields. + Name of the public field. + Expected value. + + + + + Constrains the parameter to have a public field satisfying a specified constraint. + + Name of the public field. + Constraint for the public field. + + + + Constrains the parameter to have a public field satisfying a specified constraint. + + The type that declares the public field, used to disambiguate between public fields. + Name of the public field. + Constraint for the public field. + + + + Determines whether the parameter has the specified public field and that it is null. + + Name of the public field. + + + + + Determines whether the parameter has the specified public field and that it is null. + + The type that declares the public field, used to disambiguate between public fields. + Name of the public field. + + + + + Determines whether the parameter has the specified public field and that it is not null. + + Name of the public field. + + + + + Determines whether the parameter has the specified public field and that it is not null. + + The type that declares the public field, used to disambiguate between public fields. + Name of the public field. + + + + + Central location for constraints + + + + + Evaluate a greater than constraint for . + + The object the parameter should be greater than + + + + Evaluate a less than constraint for . + + The object the parameter should be less than + + + + Evaluate a less than or equal constraint for . + + The object the parameter should be less than or equal to + + + + Evaluate a greater than or equal constraint for . + + The object the parameter should be greater than or equal to + + + + Evaluate an equal constraint for . + + The object the parameter should equal to + + + + Evaluate a not equal constraint for . + + The object the parameter should not equal to + + + + Evaluate a same as constraint. + + The object the parameter should the same as. + + + + Evaluate a not same as constraint. + + The object the parameter should not be the same as. + + + + A constraints that accept anything + + + + + + A constraint that accept only nulls + + + + + + A constraint that accept only non null values + + + + + + A constraint that accept only value of the specified type + + + + + A constraint that accept only value of the specified type + + + + + Evaluate a parameter using a predicate + + The predicate to use + + + + Central location for constraints about lists and collections + + + + + Determines whether the specified obj is in the parameter. + The parameter must be IEnumerable. + + Obj. + + + + + Determines whatever the parameter is in the collection. + + + + + Determines that the parameter collection is identical to the specified collection + + + + + Determines that the parameter collection has the specified number of elements. + + The constraint that should be applied to the collection count. + + + + Determines that an element of the parameter collections conforms to another AbstractConstraint. + + The zero-based index of the list element. + The constraint which should be applied to the list element. + + + + Determines that an element of the parameter collections conforms to another AbstractConstraint. + + The key of the element. + The constraint which should be applied to the element. + + + + Determines that all elements of the specified collection are in the the parameter collection + + The collection to compare against + The constraint which should be applied to the list parameter. + + + + Central location for constraints for object's properties + + + + + Constrains the parameter to have property with the specified value + + Name of the property. + Expected value. + + + + + Constrains the parameter to have property with the specified value. + + The type that declares the property, used to disambiguate between properties. + Name of the property. + Expected value. + + + + + Constrains the parameter to have a property satisfying a specified constraint. + + Name of the property. + Constraint for the property. + + + + Constrains the parameter to have a property satisfying a specified constraint. + + The type that declares the property, used to disambiguate between properties. + Name of the property. + Constraint for the property. + + + + Determines whether the parameter has the specified property and that it is null. + + Name of the property. + + + + + Determines whether the parameter has the specified property and that it is null. + + The type that declares the property, used to disambiguate between properties. + Name of the property. + + + + + Determines whether the parameter has the specified property and that it is not null. + + Name of the property. + + + + + Determines whether the parameter has the specified property and that it is not null. + + The type that declares the property, used to disambiguate between properties. + Name of the property. + + + + + constraints the parameter to have the exact same property values as the expected object. + + An object, of the same type as the parameter, whose properties are set with the expected values. + An instance of the constraint that will do the actual check. + + The parameter's public property values and public field values will be matched against the expected object's + public property values and public field values. The first mismatch will be reported and no further matching is done. + The matching is recursive for any property or field that has properties or fields of it's own. + Collections are supported through IEnumerable, which means the constraint will check if the actual and expected + collection contain the same values in the same order, where the values contained by the collection can have properties + and fields of their own that will be checked as well because of the recursive nature of this constraint. + + + + + Central location for all text related constraints + + + + + Constrain the argument to starts with the specified string + + + + + Constrain the argument to end with the specified string + + + + + Constrain the argument to contain the specified string + + + + + Constrain the argument to validate according to regex pattern + + + + + Provides access to the constraintes defined in the class to be used in context + with the syntax. + + + + + Constrain the argument to starts with the specified string + + + + + + Constrain the argument to end with the specified string + + + + + Constrain the argument to contain the specified string + + + + + Constrain the argument to validate according to regex pattern + + + + + Throws NotSupportedException. Don't use Equals to define constraints. Use Equal instead. + + + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + This class defines a lot of method signatures, which we will use + to allow compatability on net-2.0 + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + Allows expectations to be set on methods that should never be called. + For methods with void return value, you need to use LastCall or + DoNotExpect.Call() with a delegate. + + + + + Sets LastCall.Repeat.Never() on /any/ proxy on /any/ repository on the current thread. + This method if not safe for multi threading scenarios. + + + + + Accepts a delegate that will execute inside the method which + LastCall.Repeat.Never() will be applied to. + It is expected to be used with anonymous delegates / lambda expressions and only one + method should be called. + + + IService mockSrv = mocks.CreateMock(typeof(IService)) as IService; + DoNotExpect.Call(delegate{ mockSrv.Stop(); }); + ... + + + + + An expectaton violation was detected. + + + + + Creates a new instance. + + Message. + + + + Serialization constructor + + + + + Signals that an object was call on a mock repository which doesn't + belong to this mock repository or not a mock + + + + + Creates a new instance. + + Message. + + + + Serialization constructor + + + + + Allows to set expectation on methods that has return values. + For methods with void return value, you need to use LastCall + + + + + The method options for the last call on /any/ proxy on /any/ repository on the current thread. + This method if not safe for multi threading scenarios, use . + + + + + Accepts a delegate that will execute inside the method, and then return the resulting + instance. + It is expected to be used with anonymous delegates / lambda expressions and only one + method should be called. + + + IService mockSrv = mocks.CreateMock(typeof(IService)) as IService; + Expect.Call(delegate{ mockSrv.Start(); }).Throw(new NetworkException()); + ... + + + + + Get the method options for the last method call on the mockInstance. + + + + + A delegate that can be used to get better syntax on Expect.Call(delegate { foo.DoSomething(); }); + + + + + Abstract class that holds common information for + expectations. + + + + + Interface to validate that a method call is correct. + + + + + Validate the arguments for the method. + This method can be called numerous times, so be careful about side effects + + The arguments with which the method was called + + + + Add an actual method call to this expectation + + + + + Returns the return value or throw the exception and setup any output / ref parameters + that has been set. + + + + + Builds the verification failure message. + + + + + + Gets the error message. + + + + + + Range of expected calls + + + + + Number of call actually made for this method + + + + + If this expectation is still waiting for calls. + + + + + The return value for a method matching this expectation + + + + + Gets or sets the exception to throw on a method matching this expectation. + + + + + Gets a value indicating whether this instance's action is staisfied. + A staisfied instance means that there are no more requirements from + this method. A method with non void return value must register either + a return value or an exception to throw. + + + + + Gets the method this expectation is for. + + + + + Gets or sets what special condtions there are for this method + repeating. + + + + + Gets a value indicating whether this expectation was satisfied + + + + + Specify whatever this expectation has a return value set + You can't check ReturnValue for this because a valid return value include null. + + + + + An action to execute when the method is matched. + + + + + Set the out / ref parameters for the method call. + The indexing is zero based and ignores any non out/ref parameter. + It is possible not to pass all the parameters. This method can be called only once. + + + + + Documentation Message + + + + + Gets the invocation for this expectation + + The invocation. + + + + Occurs when the exceptation is match on a method call + + + + + Allow to set the return value in the future, if it was already set. + + + + + Number of actuall calls made that passed this expectation + + + + + Range of expected calls that should pass this expectation. + + + + + The return value for a method matching this expectation + + + + + The exception to throw on a method matching this expectation. + + + + + The method this expectation is for. + + + + + The return value for this method was set + + + + + Whether this method will repeat + unlimited number of times. + + + + + A delegate that will be run when the + expectation is matched. + + + + + The arguments that matched this expectation. + + + + + Documentation message + + + + + The method originalInvocation + + + + + Get the hash code + + + + + Add an actual actualMethodCall call to this expectation + + + + + Builds the verification failure message. + + + + + + Returns the return value or throw the exception and setup output / ref parameters + + + + + Validate the arguments for the method on the child methods + + The arguments with which the method was called + + + + Creates a new instance. + + The originalInvocation for this method, required because it contains the generic type infromation + Number of method calls for this expectations + + + + Creates a new instance. + + Expectation. + + + + Validate the arguments for the method on the child methods + + The arguments with which the method was called + + + + Determines if this object equal to obj + + + + + The error message for these arguments + + + + + Asserts that the delegate has the same parameters as the expectation's method call + + + + + Setter for the outpur / ref parameters for this expecataion. + Can only be set once. + + + + + Specify whether this expectation has a return value set + You can't check ReturnValue for this because a valid return value include null. + + + + + Gets the method this expectation is for. + + + + + Gets the originalInvocation for this expectation + + The originalInvocation. + + + + Gets or sets what special condtions there are for this method + + + + + Range of expected calls + + + + + Number of call actually made for this method + + + + + If this expectation is still waiting for calls. + + + + + Gets a value indicating whether this expectation was satisfied + + + + + The return value for a method matching this expectation + + + + + An action to execute when the method is matched. + + + + + Gets or sets the exception to throw on a method matching this expectation. + + + + + Gets a value indicating whether this instance's action is staisfied. + A staisfied instance means that there are no more requirements from + this method. A method with non void return value must register either + a return value or an exception to throw or an action to execute. + + + + + Documentation message + + + + + Occurs when the exceptation is match on a method call + + + + + Allow to set the return value in the future, if it was already set. + + + + + Gets the error message. + + + + + + Expectation that matches any arguments for the method. + + + + + Creates a new instance. + + Invocation for this expectation + Number of method calls for this expectations + + + + Creates a new instance. + + Expectation. + + + + Validate the arguments for the method. + + The arguments with which the method was called + + + + Determines if the object equal to expectation + + + + + Get the hash code + + + + + Gets the error message. + + + + + + Summary description for ArgsEqualExpectation. + + + + + Creates a new instance. + + Expected args. + The invocation for this expectation + Number of method calls for this expectations + + + + Validate the arguments for the method. + + The arguments with which the method was called + + + + Determines if the object equal to expectation + + + + + Get the hash code + + + + + Gets the error message. + + + + + + Get the expected args. + + + + + Call a specified callback to verify the expectation + + + + + Creates a new instance. + + Expectation. + Callback. + + + + Creates a new instance. + + Invocation for this expectation + Callback. + Number of method calls for this expectations + + + + Validate the arguments for the method on the child methods + + The arguments with which the method was called + + + + Determines if the object equal to expectation + + + + + Get the hash code + + + + + Gets the error message. + + + + + + Expect the method's arguments to match the contraints + + + + + Creates a new instance. + + Invocation for this expectation + Constraints. + Number of method calls for this expectations + + + + Creates a new instance. + + Expectation. + Constraints. + + + + Validate the arguments for the method. + + The arguments with which the method was called + + + + Determines if the object equal to expectation + + + + + Get the hash code + + + + + Gets the error message. + + + + + + Doesn't log anything, just makes happy noises + + + + + Log expectations - allows to see what is going on inside Rhino Mocks + + + + + Logs the expectation as is was recorded + + The invocation. + The expectation. + + + + Logs the expectation as it was recorded + + The invocation. + The expectation. + + + + Logs the unexpected method call. + + The invocation. + The message. + + + + Logs the expectation as is was recorded + + The invocation. + The expectation. + + + + Logs the expectation as it was recorded + + The invocation. + The expectation. + + + + Logs the unexpected method call. + + The invocation. + The message. + + + + Operation on a remoting proxy + + + It is not possible to directly communicate to a real proxy via transparent proxy. + Transparent proxy impersonates a user type and only methods of that user type are callable. + The only methods that are guaranteed to exist on any transparent proxy are methods defined + in Object: namely ToString(), GetHashCode(), and Equals()). + + These three methods are the only way to tell the real proxy to do something. + Equals() is the most suitable of all, since it accepts an arbitrary object parameter. + The RemotingProxy code is built so that if it is compared to an IRemotingProxyOperation, + transparentProxy.Equals(operation) will call operation.Process(realProxy). + This way we can retrieve a real proxy from transparent proxy and perform + arbitrary operation on it. + + + + + Generates remoting proxies and provides utility functions + + + + + Create the proxy using remoting + + + + + Check whether an object is a transparent proxy with a RemotingProxy behind it + + Object to check + true if the object is a transparent proxy with a RemotingProxy instance behind it, false otherwise + We use Equals() method to communicate with the real proxy behind the object. + See IRemotingProxyOperation for more details + + + + Retrieve a mocked object from a transparent proxy + + Transparent proxy with a RemotingProxy instance behind it + Mocked object associated with the proxy + We use Equals() method to communicate with the real proxy behind the object. + See IRemotingProxyOperation for more details + + + + Implementation of IInvocation based on remoting proxy + + Some methods are marked NotSupported since they either don't make sense + for remoting proxies, or they are never called by Rhino Mocks + + + + Rudimetry implementation that simply logs methods calls as text. + + + + + Initializes a new instance of the class. + + The writer. + + + + Logs the expectation as it was recorded + + The invocation. + The expectation. + + + + Logs the expectation as it was recorded + + The invocation. + The expectation. + + + + Logs the unexpected method call. + + The invocation. + The message. + + + + Behave like a stub, all properties and events acts normally, methods calls + return default values by default (but can use expectations to set them up), etc. + + + + + Records all the expectations for a mock + + + + + Different actions on this mock + + + + + Add a method call for this state' mock. + + The invocation for this method + The method that was called + The arguments this method was called with + + + + Verify that this mock expectations have passed. + + + + + Verify that we can move to replay state and move + to the reply state. + + + + + Gets a mock state that match the original mock state of the object. + + + + + Get the options for the last method call + + + + + Set the exception to throw when Verify is called. + This is used to report exception that may have happened but where caught in the code. + This way, they are reported anyway when Verify() is called. + + + + + This method is called to indicate that a property behavior call. + This is done so we generate good error message in the common case of people using + Stubbed properties with Return(). + + + + + Gets the matching verify state for this state + + + + + Get the options for the last method call + + + + + Get the options for the last method call + + + + + Set the exception to throw when Verify is called. + This is used to report exception that may have happened but where caught in the code. + This way, they are reported anyway when Verify() is called. + + + + + This method is called to indicate that a property behavior call. + This is done so we generate good error message in the common case of people using + Stubbed properties with Return(). + + + + + Creates a new instance. + + Repository. + The proxy that generates the method calls + + + + Add a method call for this state' mock. + + The invocation for this method + The method that was called + The arguments this method was called with + + + + Verify that we can move to replay state and move + to the reply state. + + + + + Verify that we can move to replay state and move + to the reply state. + + + + + Verify that this mock expectations have passed. + + + + + Gets a mock state that match the original mock state of the object. + + + + + Asserts the previous method is closed (had an expectation set on it so we can replay it correctly) + + + + + Get the default call count range expectation + + + + + + Gets the last expectation. + + + + + Gets the total method calls count. + + + + + Get the options for the last method call + + + + + Gets the matching verify state for this state + + + + + Initializes a new instance of the class. + + The proxy that generates the method calls + Repository. + + + + We don't care much about expectations here, so we will remove the expectation if + it is not closed. + + + + + Verify that we can move to replay state and move + to the reply state. + + + + + + Get the default call count range expectation + + + + + + Validate expectations on recorded methods, but in general completely ignoring them. + Similar to except that it would return a + when BackToRecord is called. + + + + + Validate all expectations on a mock + + + + + The repository for this state + + + + + The proxy object for this state + + + + + Get the options for the last method call + + + + + Creates a new instance. + + The previous state for this method + + + + Add a method call for this state' mock. + + The invocation for this method + The method that was called + The arguments this method was called with + + + + Add a method call for this state' mock. + This allows derived method to cleanly get a the setupresult behavior while adding + their own. + + The invocation for this method + The method that was called + The arguments this method was called with + + + + Set the exception to throw when Verify is called. + This is used to report exception that may have happened but where caught in the code. + This way, they are reported anyway when Verify() is called. + + + + + not relevant + + + + + Verify that this mock expectations have passed. + + + + + Verify that we can move to replay state and move + to the reply state. + + + + + Gets a mock state that match the original mock state of the object. + + + + + Get the options for the last method call + + + + + Gets the matching verify state for this state + + + + + Initializes a new instance of the class. + + The previous state for this method + + + + Add a method call for this state' mock. + + The invocation for this method + The method that was called + The arguments this method was called with + + + + Gets a mock state that matches the original mock state of the object. + + + + + Write rhino mocks log info to the trace + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + if set to true [log recorded]. + if set to true [log replayed]. + if set to true [log unexpected]. + + + + Logs the expectation as is was recorded + + The invocation. + The expectation. + + + + Logs the expectation as it was recorded + + The invocation. + The expectation. + + + + Logs the unexpected method call. + + The invocation. + The message. + + + + Writes log information as stack traces about rhino mocks activity + + + + + Allows to redirect output to a different location. + + + + + Logs the expectation as is was recorded + + The invocation. + The expectation. + + + + Logs the expectation as it was recorded + + The invocation. + The expectation. + + + + Logs the unexpected method call. + + The invocation. + The message. + + + + Marker interface used to indicate that this is a partial mock. + + + + + Options for CallOriginalMethod + + + + + No expectation is created, the method will be called directly + + + + + Normal expectation is created, but when the method is later called, it will also call the original method + + + + + This is a data structure that is used by + to pass + the current method to the relevant delegate + + + + + Initializes a new instance of the class. + + The invocation. + + + + Gets the args for this method invocation + + + + + Get the method that was caused this invocation + + + + + Gets or sets the return value for this method invocation + + The return value. + + + + Adds optional new usage: + using(mockRepository.Record()) { + Expect.Call(mock.Method()).Return(retVal); + } + using(mockRepository.Playback()) { + // Execute code + } + N.B. mockRepository.ReplayAll() and mockRepository.VerifyAll() + calls are taken care of by Record/Playback + + + Creates proxied instances of types. + + + + Generates a stub without needing a + Arguments for 's constructor + The of stub to create. + The stub + + + + Generates a stub without needing a + The of stub. + Arguments for the 's constructor. + The stub + + + + Generate a mock object without needing a + type of mock object to create. + Arguments for 's constructor + the mock object + + + + Generate a multi-mock object without needing a + The typeof object to generate a mock for. + A second interface to generate a multi-mock for. + Arguments for 's constructor + the multi-mock object + + + + Generate a multi-mock object without without needing a + The typeof object to generate a mock for. + An interface to generate a multi-mock for. + A second interface to generate a multi-mock for. + Arguments for 's constructor + the multi-mock object + + + + Creates a multi-mock without without needing a + The type of mock to create, this can be a class + Any extra interfaces to add to the multi-mock, these can only be interfaces. + Arguments for 's constructor + the multi-mock object + + + + Creates a strict mock without without needing a + Any arguments required for the 's constructor + The type of mock object to create. + The mock object with strict replay semantics + + + + Creates a strict multi-mock without needing a + Any arguments required for the 's constructor + The type of mock object to create, this can be a class. + An interface to generate a multi-mock for, this must be an interface! + The multi-mock object with strict replay semantics + + + + Creates a strict multi-mock without needing a + Any arguments required for the 's constructor + The type of mock object to create, this can be a class. + An interface to generate a multi-mock for, this must be an interface! + A second interface to generate a multi-mock for, this must be an interface! + The multi-mock object with strict replay semantics + + + + Creates a strict multi-mock without needing a + The type of mock object to create, this can be a class + Any extra interfaces to generate a multi-mock for, these must be interaces! + Any arguments for the 's constructor + The strict multi-mock object + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Generate a mock object with dynamic replay semantics and remoting without needing the mock repository + + + + + Generate a mock object with strict replay semantics and remoting without needing the mock repository + + + + Helper method to create a mock object without a repository instance and put the object back into replay mode. + The type of mock object to create + A delegate that uses a mock repository instance to create the underlying mock + The mock object in the replay mode. + + + + + + + + + + + + + + This is a map of types to ProxyGenerators. + + + + + This is used to record the last repository that has a method called on it. + + + + + this is used to get to the last proxy on this repository. + + + + + For mock delegates, maps the proxy instance from intercepted invocations + back to the delegate that was originally returned to client code, if any. + + + + + All the proxies in the mock repositories + + + + + This is here because we can't put it in any of the recorders, since repeatable methods + have no orderring, and if we try to handle them using the usual manner, we would get into + wierd situations where repeatable method that was defined in an orderring block doesn't + exists until we enter this block. + + + + + Creates a new instance. + + + + + Move the repository to ordered mode + + + + + Move the repository to un-ordered mode + + + + + Creates a mock for the specified type. + + Type. + Arguments for the class' constructor, if mocking a concrete class + + + + Creates a strict mock for the specified type. + + Type. + Arguments for the class' constructor, if mocking a concrete class + + + + Creates a remoting mock for the specified type. + + Type. + Arguments for the class' constructor, if mocking a concrete class + + + + Creates a strict remoting mock for the specified type. + + Type. + Arguments for the class' constructor, if mocking a concrete class + + + + Creates a remoting mock for the specified type. + + + Arguments for the class' constructor, if mocking a concrete class + + + + + Creates a strict remoting mock for the specified type. + + + Arguments for the class' constructor, if mocking a concrete class + + + + + Creates a mock from several types, with strict semantics. + Only may be a class. + + + + + Creates a strict mock from several types, with strict semantics. + Only may be a class. + + + + + Creates a mock from several types, with strict semantics. + Only may be a class. + + The main type to mock. + Extra interface types to mock. + Arguments for the class' constructor, if mocking a concrete class. + + + + Creates a strict mock from several types, with strict semantics. + Only may be a class. + + The main type to mock. + Extra interface types to mock. + Arguments for the class' constructor, if mocking a concrete class. + + + + Creates a mock from several types, with dynamic semantics. + Only may be a class. + + The main type to mock. + Extra interface types to mock. + + + + Creates a mock from several types, with dynamic semantics. + Only may be a class. + + The main type to mock. + Extra interface types to mock. + Arguments for the class' constructor, if mocking a concrete class. + + + Creates a dynamic mock for the specified type. + Type. + Arguments for the class' constructor, if mocking a concrete class + + + Creates a dynamic mock for the specified type. + Type. + Arguments for the class' constructor, if mocking a concrete class + + + Creates a dynamic mock for the specified type. + + Arguments for the class' constructor, if mocking a concrete class + + + + Creates a mock object that defaults to calling the class methods if no expectation is set on the method. + Type. + Arguments for the class' constructor. + + + Creates a mock object that defaults to calling the class methods. + Type. + Extra interface types to mock. + + + Creates a mock object that defaults to calling the class methods. + Type. + Extra interface types to mock. + Arguments for the class' constructor. + + + Creates a mock object using remoting proxies + Type to mock - must be MarshalByRefObject + Mock object + Proxy mock can mock non-virtual methods, but not static methods + Creates the mock state for this proxy + + + + Cause the mock state to change to replay, any further call is compared to the + ones that were called in the record state. + + This method *cannot* be called from inside an ordering. + the object to move to replay state + + + + Cause the mock state to change to replay, any further call is compared to the + ones that were called in the record state. + + the object to move to replay state + + + + Move the mocked object back to record state.You can (and it's recommended) to run {Verify()} before you use this method. + Will delete all current expectations! + + + + Move the mocked object back to record state. + Optionally, can delete all current expectations, but allows more granularity about how + it would behave with regard to the object state. + + + + + Verify that all the expectations for this object were fulfilled. + + the object to verify the expectations for + + + + Get the method options for the last call on + mockedInstance. + + The mock object + Method options for the last call + + + + Maps an invocation proxy back to the mock object instance that was originally + returned to client code which might have been a delegate to this proxy. + + The mock object proxy from the intercepted invocation + The mock object + + + This is provided to allow advance extention functionality, where Rhino Mocks standard functionality is not enough. + The type to mock + Delegate that create the first state of the mocked object (usualy the record state). + Additional types to be implemented, this can be only interfaces + optional arguments for the constructor + + + + + Method: GetMockedObject + Get an IProxy from a mocked object instance, or throws if the + object is not a mock object. + + + + + Method: GetMockedObjectOrNull + Get an IProxy from a mocked object instance, or null if the + object is not a mock object. + + + + Pops the recorder. + + + Pushes the recorder. + New recorder. + + + + All the mock objects in this repository will be moved + to record state. + + + + + All the mock objects in this repository will be moved + to record state. + + + + + Replay all the mocks from this repository + + + + + Verify all the mocks from this repository + + + + + Gets the proxy generator for a specific type. Having a single ProxyGenerator + with multiple types linearly degrades the performance so this implementation + keeps one ProxyGenerator per type. + + + + Set the exception to be thrown when verified is called. + + + + Creates a mock for the spesified type with strict mocking semantics. + Strict semantics means that any call that wasn't explicitly recorded is considered an error and would cause an exception to be thrown. + + Arguments for the class' constructor, if mocking a concrete class + + + + Creates a mock for the spesified type with strict mocking semantics. + Strict semantics means that any call that wasn't explicitly recorded is considered an error and would cause an exception to be thrown. + + Arguments for the class' constructor, if mocking a concrete class + + + + Creates a dynamic mock for the specified type. + + Arguments for the class' constructor, if mocking a concrete class + + + + Creates a mock object from several types. + + + + + Creates a strict mock object from several types. + + + + + Create a mock object from several types with dynamic semantics. + + + + + Create a mock object from several types with partial semantics. + + + + + Create a mock object from several types with strict semantics. + + Extra interface types to mock. + Arguments for the class' constructor, if mocking a concrete class + + + + Create a strict mock object from several types with strict semantics. + + Extra interface types to mock. + Arguments for the class' constructor, if mocking a concrete class + + + + Create a mock object from several types with dynamic semantics. + + Extra interface types to mock. + Arguments for the class' constructor, if mocking a concrete class + + + + Create a mock object from several types with partial semantics. + + Extra interface types to mock. + Arguments for the class' constructor, if mocking a concrete class + + + + Create a mock object with from a class that defaults to calling the class methods + + Arguments for the class' constructor, if mocking a concrete class + + + + Create a stub object, one that has properties and events ready for use, and + can have methods called on it. It requires an explicit step in order to create + an expectation for a stub. + + The arguments for constructor. + + + + Create a stub object, one that has properties and events ready for use, and + can have methods called on it. It requires an explicit step in order to create + an expectation for a stub. + + The type. + The arguments for constructor. + The stub + + + + Returns true if the passed mock is currently in replay mode. + + The mock to test. + True if the mock is in replay mode, false otherwise. + + + + Determines whether the specified proxy is a stub. + + The proxy. + + + + Register a call on a prperty behavior + + + + + + Gets the recorder. + + + + + + Gets the replayer for this repository. + + + + + + Gets the last proxy which had a method call. + + + + + Delegate: CreateMockState + This is used internally to cleanly handle the creation of different + RecordMockStates. + + + + + A set of extension methods that adds Arrange Act Assert mode to Rhino Mocks + + + + + Create an expectation on this mock for this action to occur + + + The mock. + The action. + + + + + Reset all expectations on this mock object + + + The mock. + + + + Reset the selected expectation on this mock object + + + The mock. + The options to reset the expectations on this mock. + + + + Cause the mock state to change to replay, any further call is compared to the + ones that were called in the record state. + + the mocked object to move to replay state + + + + Gets the mock repository for this specificied mock object + + + The mock. + + + + + Create an expectation on this mock for this action to occur + + + + The mock. + The action. + + + + + Tell the mock object to perform a certain action when a matching + method is called. + Does not create an expectation for this method. + + + The mock. + The action. + + + + + Tell the mock object to perform a certain action when a matching + method is called. + Does not create an expectation for this method. + + + + The mock. + The action. + + + + + Gets the arguments for calls made on this mock object and the method that was called + in the action. + + + The mock. + The action. + + + Here we will get all the arguments for all the calls made to DoSomething(int) + + var argsForCalls = foo54.GetArgumentsForCallsMadeOn(x => x.DoSomething(0)) + + + + + + Gets the arguments for calls made on this mock object and the method that was called + in the action and matches the given constraints + + + The mock. + The action. + The setup constraints. + + + Here we will get all the arguments for all the calls made to DoSomething(int) + + var argsForCalls = foo54.GetArgumentsForCallsMadeOn(x => x.DoSomething(0)) + + + + + + Asserts that a particular method was called on this mock object + + + The mock. + The action. + + + + Asserts that a particular method was called on this mock object that match + a particular constraint set. + + + The mock. + The action. + The setup constraints. + + + + Asserts that a particular method was called on this mock object that match + a particular constraint set. + + + The mock. + The action. + + + + Asserts that a particular method was called on this mock object that match + a particular constraint set. + + + The mock. + The action. + The setup constraints. + + + + Asserts that a particular method was NOT called on this mock object + + + The mock. + The action. + + + + Asserts that a particular method was NOT called on this mock object that match + a particular constraint set. + + + The mock. + The action. + The setup constraints. + + + + Asserts that a particular method was NOT called on this mock object + + + The mock. + The action. + + + + Asserts that a particular method was NOT called on this mock object + + + The mock. + The action. + The setup constraints. + + + + Finds the approprite implementation type of this item. + This is the class or an interface outside of the rhino mocks. + + The mocked obj. + + + + + Verifies all expectations on this mock object + + The mock object. + + + + Gets the event raiser for the event that was called in the action passed + + The type of the event source. + The mock object. + The event subscription. + + + + + Raise the specified event using the passed arguments. + The even is extracted from the passed labmda + + The type of the event source. + The mock object. + The event subscription. + The sender. + The instance containing the event data. + + + + Raise the specified event using the passed arguments. + The even is extracted from the passed labmda + + The type of the event source. + The mock object. + The event subscription. + The args. + + + TODO: Make this better! It currently breaks down when mocking classes or + ABC's that call other virtual methods which are getting intercepted too. I wish + we could just walk Expression{Action{Action{T}} to assert only a single + method is being made. + + The workaround is to not call foo.AssertWasCalled .. rather foo.VerifyAllExpectations() + The type of mock object + The mock repository + The actual mock object to assert expectations on. + + + + Fake type that disallow creating it. + Should have been System.Type, but we can't use it. + + + + + Utility class for dealing with messing generics scenarios. + + + + + There are issues with trying to get this to work correctly with open generic types, since this is an edge case, + I am letting the runtime handle it. + + + + + Gets the real type, including de-constructing and constructing the type of generic + methods parameters. + + The type. + The invocation. + + + + + Because we need to support complex types here (simple generics were handled above) we + need to be aware of the following scenarios: + List[T] and List[Foo[T]] + + + + + ExpectationsList + + + + + Dictionary + + + + + Dictionary class + + + + + Create a new instance of ProxyStateDictionary + + + + + Allows to call a method and immediately get it's options. + + + + + Interface to allow calling a method and immediately get it's options. + + + + + Get the method options for the call + + The method call should go here, the return value is ignored + + + + Creates a new instance. + + + + + Get the method options for the call + + The method call should go here, the return value is ignored + + + + Allows to call a method and immediately get it's options. + Set the expected number for the call to Any() + + + + + Creates a new instance. + + Proxy. + Mocked instance. + + + + Get the method options for the call + + The method call should go here, the return value is ignored + + + + This class is reponsible for taking a delegate and creating a wrapper + interface around it, so it can be mocked. + + + + + The scope for all the delegate interfaces create by this mock repository. + + + + + Gets a type with an "Invoke" method suitable for use as a target of the + specified delegate type. + + + + + + + Raise events for all subscribers for an event + + + + + Raise events for all subscribers for an event + + + + + Raise the event + + + + + The most common form for the event handler signature + + + + + Create an event raiser for the specified event on this instance. + + + + + Creates a new instance of EventRaiser + + + + + Raise the event + + + + + The most common signature for events + Here to allow intellisense to make better guesses about how + it should suggest parameters. + + + + + Allows to define what would happen when a method + is called. + + + + + Allows to define what would happen when a method + is called. + + + + + Set the return value for the method. + + The object the method will return + IRepeat that defines how many times the method will return this value + + + + Allow to override this return value in the future + + IRepeat that defines how many times the method will return this value + + + + Throws the specified exception when the method is called. + + Exception to throw + + + + Ignores the arguments for this method. Any argument will be matched + againt this method. + + + + + Add constraints for the method's arguments. + + + + + Set a callback method for the last call + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched + and allow to optionally modify the invocation as needed + + + + + Call the original method on the class, bypassing the mocking layers. + + + + + + Call the original method on the class, optionally bypassing the mocking layers. + + + + + + Use the property as a simple property, getting/setting the values without + causing mock expectations. + + + + + Expect last (property) call as property setting, ignore the argument given + + + + + + Expect last (property) call as property setting with a given argument. + + + + + + + Get an event raiser for the last subscribed event. + + + + + Set the parameter values for out and ref parameters. + This is done using zero based indexing, and _ignoring_ any non out/ref parameter. + + + + + Documentation message for the expectation + + Message + + + + Better syntax to define repeats. + + + + + Allows to specify the number of time for method calls + + + + + Repeat the method twice. + + + + + Repeat the method once. + + + + + Repeat the method at least once, then repeat as many time as it would like. + + + + + Repeat the method any number of times. + This has special affects in that this method would now ignore orderring. + + + + + Set the range to repeat an action. + + Min. + Max. + + + + Set the amount of times to repeat an action. + + + + + This method must not appear in the replay state. + This has special affects in that this method would now ignore orderring. + + + + + Creates a new instance. + + the repository for this expectation + the recorder for this proxy + the proxy for this expectation + Expectation. + + + + Add constraints for the method's arguments. + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set the return value for the method. + + The object the method will return + IRepeat that defines how many times the method will return this value + + + + Set the return value for the method, but allow to override this return value in the future + + IRepeat that defines how many times the method will return this value + + + + Throws the specified exception when the method is called. + + Exception to throw + + + + Ignores the arguments for this method. Any argument will be matched + againt this method. + + + + + Call the original method on the class, bypassing the mocking layers. + + + + + + Call the original method on the class, optionally bypassing the mocking layers + + + + + + Use the property as a simple property, getting/setting the values without + causing mock expectations. + + + + + Expect last (property) call as property setting, ignore the argument given + + + + + + Expect last (property) call as property setting with a given argument. + + + + + + + Gets the event raiser for the last event + + + + + Set the parameter values for out and ref parameters. + This is done using zero based indexing, and _ignoring_ any non out/ref parameter. + + + + + Repeat the method twice. + + + + + Repeat the method once. + + + + + Repeat the method at least once, then repeat as many time as it would like. + + + + + This method must not appear in the replay state. + + + + + Documentation message for the expectation + + Message + + + + Repeat the method any number of times. + + + + + Set the range to repeat an action. + + Min. + Max. + + + + Set the amount of times to repeat an action. + + + + + Better syntax to define repeats. + + + + + This class will provide hash code for hashtables without needing + to call the GetHashCode() on the object, which may very well be mocked. + This class has no state so it is a singelton to avoid creating a lot of objects + that does the exact same thing. See flyweight patterns. + + + + + Get the hash code for a proxy object without calling GetHashCode() + on the object. + + + + + Compares two instances of mocked objects + + + + + Compare two mocked objects + + + + + The next hash code value for a mock object. + This is safe for multi threading. + + + + + The sole instance of + + + + + This is a dummy type that is used merely to give DynamicProxy the proxy instance that + it needs to create IProxy's types. + + + + + Interface to find the repository of a mocked object + + + + + Return true if it should call the original method on the object + instead of pass it to the message chain. + + The method to call + + + + Register a method to be called on the object directly + + + + + Register a property on the object that will behave as a simple property + + + + + Check if the method was registered as a property method. + + + + + Do get/set on the property, according to need. + + + + + Do add/remove on the event + + + + + Get the subscribers of a spesific event + + + + + Gets the declaring type of the method, taking into acccount the possible generic + parameters that it was created with. + + + + + Clears the state of the object, remove original calls, property behavior, subscribed events, etc. + + + + + Get all the method calls arguments that were made against this object with the specificed + method. + + + Only method calls in replay mode are counted + + + + + Records the method call + + + + + Mocks that are tied to this mock lifestyle + + + + + The unique hash code of this mock, which is not related + to the value of the GetHashCode() call on the object. + + + + + Gets the repository. + + + + + Gets the implemented types by this mocked object + + The implemented. + + + + Gets or sets the constructor arguments. + + The constructor arguments. + + + + The mocked instance that this is representing + + + + + Create a new instance of + + + + + Return true if it should call the original method on the object + instead of pass it to the message chain. + + The method to call + + + + Register a method to be called on the object directly + + + + + Register a property on the object that will behave as a simple property + Return true if there is already a value for the property + + + + + Check if the method was registered as a property method. + + + + + Do get/set on the property, according to need. + + + + + Do add/remove on the event + + + + + Get the subscribers of a spesific event + + + + + Gets the declaring type of the method, taking into acccount the possible generic + parameters that it was created with. + + + + + Get all the method calls arguments that were made against this object with the specificed + method. + + + + + Only method calls in replay mode are counted + + + + + Records the method call + + + + + + + Clears the state of the object, remove original calls, property behavior, subscribed events, etc. + + + + + Mocks that are tied to this mock lifestyle + + + + + The unique hash code of this proxy, which is not related + to the value of the GetHashCode() call on the object. + + + + + Gets the repository. + + + + + Gets or sets the constructor arguments. + + The constructor arguments. + + + + The mocked instance that this is representing + + + + + Gets the implemented types by this mocked object + + The implemented. + + + + Range for expected method calls + + + + + Creates a new instance. + + Min. + Max. + + + + Return the string representation of this range. + + + + + Gets or sets the min. + + + + + + Gets or sets the max. + + + + + + Records all the expectations for a mock and + return a ReplayDynamicMockState when Replay() + is called. + + + + + Creates a new instance. + + Repository. + The proxy that generates the method calls + + + + Verify that we can move to replay state and move + to the reply state. + + + + + Get the default call count range expectation + + + + + + Gets a mock state that match the original mock state of the object. + + + + + Records all the expectations for a mock and + return a ReplayPartialMockState when Replay() + is called. + + + + + Creates a new instance. + + Repository. + The proxy that generates the method calls + + + + Verify that we can move to replay state and move + to the reply state. + + + + + Gets a mock state that matches the original mock state of the object. + + + + + Options for special repeat option + + + + + This method can be called only as many times as the IMethodOptions.Expect allows. + + + + + This method should never be called + + + + + This method can be call any number of times + + + + + This method will call the original method + + + + + This method will call the original method, bypassing the mocking layer + + + + + This method will simulate simple property behavior + + + + + Validate all expectations on a mock and ignores calls to + any method that was not setup properly. + + + + + Creates a new instance. + + The previous state for this method + + + + Add a method call for this state' mock. + + The invocation for this method + The method that was called + The arguments this method was called with + + + + Gets a mock state that match the original mock state of the object. + + + + + Validate all expectations on a mock and ignores calls to + any method that was not setup properly. + + + + + Creates a new instance. + + The previous state for this method + + + + Add a method call for this state' mock. + + The invocation for this method + The method that was called + The arguments this method was called with + + + + Gets a mock state that match the original mock state of the object. + + + + + Summary description for RhinoInterceptor. + + + + + Creates a new instance. + + + + + Intercept a method call and direct it to the repository. + + + + + Validate arguments for methods + + + + + Validate that the passed argument is not null. + + The object to validate + The name of the argument + + If the obj is null, an ArgumentNullException with the passed name + is thrown. + + + + + Validate that the arguments are equal. + + Expected args. + Actual Args. + + + + Validate that the two arguments are equals, including validation for + when the arguments are collections, in which case it will validate their values. + + + + + This method is safe for use even if any of the objects is a mocked object + that override equals. + + + + + Throw an object already verified when accessed + + + + + Create a new instance of VerifiedMockState + + The previous mock state, used to get the initial record state + + + + Add a method call for this state' mock. + + The invocation for this method + The method that was called + The arguments this method was called with + + + + Verify that this mock expectations have passed. + + + + + Verify that we can move to replay state and move + to the reply state. + + + + + Gets a mock state that match the original mock state of the object. + + + + + Get the options for the last method call + + + + + Set the exception to throw when Verify is called. + This is used to report exception that may have happened but where caught in the code. + This way, they are reported anyway when Verify() is called. + + + + + not relevant + + + + + Gets the matching verify state for this state + + + + + Get the options for the last method call + + + + + Records the actions on all the mocks created by a repository. + + + + + Records the specified call with the specified args on the mocked object. + + + + + Get the expectation for this method on this object with this arguments + + + + + This check the methods that were setup using the SetupResult.For() + or LastCall.Repeat.Any() and that bypass the whole expectation model. + + + + + Gets the all expectations for a mocked object and method combination, + regardless of the expected arguments / callbacks / contraints. + + Mocked object. + Method. + List of all relevant expectation + + + + Gets the all expectations for proxy. + + Mocked object. + List of all relevant expectation + + + + Removes all the repeatable expectations for proxy. + + Mocked object. + + + + Replaces the old expectation with the new expectation for the specified proxy/method pair. + This replace ALL expectations that equal to old expectations. + + Proxy. + Method. + Old expectation. + New expectation. + + + + Adds the recorder and turn it into the active recorder. + + Recorder. + + + + Moves to previous recorder. + + + + + Gets the recorded expectation or null. + + + + + Gets the next expected calls string. + + + + + Moves to parent recorder. + + + + + Set the expectation so it can repeat any number of times. + + + + + Removes the expectation from the recorder + + + + + Clear the replayer to call (and all its chain of replayers) + This also removes it from the list of expectations, so it will never be considered again + + + + + Get the expectation for this method on this object with this arguments + + + + + Gets a value indicating whether this instance has expectations that weren't satisfied yet. + + + true if this instance has expectations; otherwise, false. + + + + + Allows to set various options for the last method call on + a specified object. + If the method has a return value, it's recommended to use Expect + + + + + Allows to get an interface to work on the last call. + + The mocked object + Interface that allows to set options for the last method call on this object + + + + Set the return value for the method. + + The object the method will return + IRepeat that defines how many times the method will return this value + + + + Set the return value for the method. This overload is needed for LastCall.Return(null) + + The object the method will return + IRepeat that defines how many times the method will return this value + + + + Throws the specified exception when the method is called. + + Exception to throw + + + + Ignores the arguments for this method. Any argument will be matched + againt this method. + + + + + Add constraints for the method's arguments. + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Call the original method on the class, bypassing the mocking layers, for the last call. + + + + + Call the original method on the class, optionally bypassing the mocking layers, for the last call. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Gets an interface that will raise the last event when called. + + + + + Set the parameter values for out and ref parameters. + This is done using zero based indexing, and _ignoring_ any non out/ref parameter. + + + + + Documentation message for the expectation + + Message + + + + Use the property as a simple property, getting/setting the values without + causing mock expectations. + + + + + Better syntax to define repeats. + + + + + Base class for method recorders, handle delegating to inner recorder if needed. + + + + + List of the expected actions on for this recorder + The legal values are: + * Expectations + * Method Recorders + + + + + The current recorder. + + + + + The current replayer; + + + + + The parent recorder of this one, may be null. + + + + + This contains a list of all the replayers that should be ignored + for a spesific method call. A replayer gets into this list by calling + ClearReplayerToCall() on its parent. This list is Clear()ed on each new invocation. + + + + + All the repeatable methods calls. + + + + + Counts the recursion depth of the current expectation search stack + + + + + Creates a new instance. + + + + + Creates a new instance. + + Parent recorder. + Repeatable methods + + + + Records the specified call with the specified args on the mocked object. + + + + + Get the expectation for this method on this object with this arguments + + + + + Gets the all expectations for a mocked object and method combination, + regardless of the expected arguments / callbacks / contraints. + + Mocked object. + Method. + List of all relevant expectation + + + + Gets the all expectations for proxy. + + Mocked object. + List of all relevant expectation + + + + Replaces the old expectation with the new expectation for the specified proxy/method pair. + This replace ALL expectations that equal to old expectations. + + Proxy. + Method. + Old expectation. + New expectation. + + + + Remove the all repeatable expectations for proxy. + + Mocked object. + + + + Set the expectation so it can repeat any number of times. + + + + + Removes the expectation from the recorder + + + + + Adds the recorder and turn it into the active recorder. + + Recorder. + + + + Moves to previous recorder. + + + + + Moves to parent recorder. + + + + + Gets the recorded expectation or null. + + + + + Clear the replayer to call (and all its chain of replayers). + This also removes it from the list of expectations, so it will never be considered again + + + + + Get the expectation for this method on this object with this arguments + + + + + Gets the next expected calls string. + + + + + Handles the real getting of the recorded expectation or null. + + + + + Handle the real execution of this method for the derived class + + + + + Handle the real execution of this method for the derived class + + + + + Handle the real execution of this method for the derived class + + + + + Handle the real execution of this method for the derived class + + + + + Handle the real execution of this method for the derived class + + + + + Handle the real execution of this method for the derived class + + + + + Should this replayer be considered valid for this call? + + + + + This check the methods that were setup using the SetupResult.For() + or LastCall.Repeat.Any() and that bypass the whole expectation model. + + + + + Gets a value indicating whether this instance has expectations that weren't satisfied yet. + + + true if this instance has expectations; otherwise, false. + + + + + Handle the real execution of this method for the derived class + + + + + Ordered collection of methods, methods must arrive in specified order + in order to pass. + + + + + Unordered collection of method records, any expectation that exist + will be matched. + + + + + The parent recorder we have redirected to. + Useful for certain edge cases in orderring. + See: FieldProblem_Entropy for the details. + + + + + Creates a new instance. + + Parent recorder. + Repeatable methods + + + + Creates a new instance. + + + + + Records the specified call with the specified args on the mocked object. + + Mocked object. + Method. + Expectation. + + + + Get the expectation for this method on this object with this arguments + + Invocation for this method + Mocked object. + Method. + Args. + True is the call was recorded, false otherwise + + + + Gets the all expectations for a mocked object and method combination, + regardless of the expected arguments / callbacks / contraints. + + Mocked object. + Method. + List of all relevant expectation + + + + Gets the all expectations for proxy. + + Mocked object. + List of all relevant expectation + + + + Replaces the old expectation with the new expectation for the specified proxy/method pair. + This replace ALL expectations that equal to old expectations. + + Proxy. + Method. + Old expectation. + New expectation. + + + + Handle the real execution of this method for the derived class + + + + + Handles the real getting of the recorded expectation or null. + + + + + Handle the real execution of this method for the derived class + + + + + Gets the next expected calls string. + + + + + Create an exception for an unexpected method call. + + + + + Gets a value indicating whether this instance has expectations that weren't satisfied yet. + + + true if this instance has expectations; otherwise, false. + + + + + Creates a new instance. + + Parent recorder. + Repetable methods + + + + Creates a new instance. + + + + + Handles the real getting of the recorded expectation or null. + + + + + Get the expectation for this method on this object with this arguments + + + + + Gets the next expected calls string. + + + + + Hold an expectation for a method call on an object + + + + + Creates a new instance. + + Proxy. + Method. + Expectation. + + + + Determines if the object equal to this instance + + Obj. + + + + + Gets the hash code. + + + + + + Gets the proxy. + + + + + + Gets the method. + + + + + + Gets the expectation. + + + + + + Holds a pair of mocked object and a method + and allows to compare them against each other. + This allows us to have a distinction between mockOne.MyMethod() and + mockTwo.MyMethod()... + + + + + Creates a new instance. + + Proxy. + Method. + + + + Determines whatever obj equals to this instance. + ProxyMethodPairs are equal when they point to the same /instance/ of + an object, and to the same method. + + Obj. + + + + + Gets the hash code. + + + + + + Gets the proxy. + + + + + + Gets the method. + + + + + + Change the recorder from ordered to unordered and vice versa + + + + + Creates a new instance. + + + + + Disposes this instance. + + + + + Accessor for the current mocker + + + + + The current mocker + + + + + Used for [assembly: InternalsVisibleTo(RhinoMocks.StrongName)] + Used for [assembly: InternalsVisibleTo(RhinoMocks.NormalName)] + + + + + Strong name for the Dynamic Proxy assemblies. Used for InternalsVisibleTo specification. + + + + + Normal name for dynamic proxy assemblies. Used for InternalsVisibleTo specification. + + + + + Logs all method calls for methods + + + + + Setup method calls to repeat any number of times. + + + + + Get the method options and set the last method call to repeat + any number of times. + This also means that the method would transcend ordering + + + + + Get the method options for the last method call on the mockInstance and set it + to repeat any number of times. + This also means that the method would transcend ordering + + + + + Utility class for working with method calls. + + + + + Return the string representation of a method call and its arguments. + + The method + The method arguments + Invocation of the method, used to get the generics arguments + Delegate to format the parameter + The string representation of this method call + + + + Return the string representation of a method call and its arguments. + + The invocation of the method, used to get the generic parameters + The method + The method arguments + The string representation of this method call + + + + Delegate to format the argument for the string representation of + the method call. + + + + + Utility to get the default value for a type + + + + + The default value for a type. + Null for reference types and void + 0 for value types. + First element for enums + Note that we need to get the value even for opened generic types, such as those from + generic methods. + + Type. + The invocation. + the default value + + + + Allows easier access to MockRepository, works closely with Mocker.Current to + allow access to a context where the mock repository is automatially verified at + the end of the code block. + + + + + Initialize a code block where Mocker.Current is initialized. + At the end of the code block, all the expectation will be verified. + This overload will create a new MockRepository. + + The code that will be executed under the mock context + + + + Initialize a code block where Mocker.Current is initialized. + At the end of the code block, all the expectation will be verified. + This overload will create a new MockRepository. + + The mock repository to use, at the end of the code block, VerifyAll() will be called on the repository. + The code that will be executed under the mock context + + + + Create a FluentMocker + + The mock repository to use. + + + + A method with no arguments and no return value that will be called under the mock context. + + + + + FluentMocker implements some kind of fluent interface attempt + for saying "With the Mocks [mocks], Expecting (in same order) [things] verify [that]." + + + + + Interface to verify previously defined expectations + + + + + Verifies if a piece of code + + + + + Defines unordered expectations + + A delegate describing the expectations + an IMockVerifier + + + + Defines ordered expectations + + A delegate describing the expectations + an IMockVerifier + + + + Verifies previously defined expectations + + + + + This delegate is compatible with the System.Func{T,R} signature + We have to define our own to get compatability with 2.0 + + + + + This attribute is here so we can get better Pex integration + Using this means that Pex will not try to inspect the work of + the actual proxies being generated by Rhino Mocks + + + + diff --git a/tools/NUnit/nunit-agent-x86.exe.config b/tools/NUnit/nunit-agent-x86.exe.config new file mode 100644 index 00000000..de2caf60 --- /dev/null +++ b/tools/NUnit/nunit-agent-x86.exe.config @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/NUnit/nunit-agent.exe.config b/tools/NUnit/nunit-agent.exe.config new file mode 100644 index 00000000..de2caf60 --- /dev/null +++ b/tools/NUnit/nunit-agent.exe.config @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/NUnit/nunit-console-x86.exe.config b/tools/NUnit/nunit-console-x86.exe.config new file mode 100644 index 00000000..81e5346c --- /dev/null +++ b/tools/NUnit/nunit-console-x86.exe.config @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/tools/NUnit/nunit-console.exe.config b/tools/NUnit/nunit-console.exe.config new file mode 100644 index 00000000..81e5346c --- /dev/null +++ b/tools/NUnit/nunit-console.exe.config @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/tools/NUnit/nunit-x86.exe.config b/tools/NUnit/nunit-x86.exe.config new file mode 100644 index 00000000..9301f946 --- /dev/null +++ b/tools/NUnit/nunit-x86.exe.config @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + diff --git a/tools/NUnit/nunit.exe.config b/tools/NUnit/nunit.exe.config new file mode 100644 index 00000000..9301f946 --- /dev/null +++ b/tools/NUnit/nunit.exe.config @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + diff --git a/tools/NUnit/pnunit-agent.exe.config b/tools/NUnit/pnunit-agent.exe.config new file mode 100644 index 00000000..c1516ef4 --- /dev/null +++ b/tools/NUnit/pnunit-agent.exe.config @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/NUnit/pnunit-launcher.exe.config b/tools/NUnit/pnunit-launcher.exe.config new file mode 100644 index 00000000..c1516ef4 --- /dev/null +++ b/tools/NUnit/pnunit-launcher.exe.config @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/NUnit/runpnunit.bat b/tools/NUnit/runpnunit.bat new file mode 100644 index 00000000..43b3a69f --- /dev/null +++ b/tools/NUnit/runpnunit.bat @@ -0,0 +1,3 @@ +start pnunit-agent 8080 . +start pnunit-agent 8081 . +pnunit-launcher test.conf diff --git a/tools/NUnit/test.conf b/tools/NUnit/test.conf new file mode 100644 index 00000000..ce825ebe --- /dev/null +++ b/tools/NUnit/test.conf @@ -0,0 +1,82 @@ + + + + + + + + + + + Testing + + + Testing + pnunit.tests.dll + TestLibraries.Testing.EqualTo19 + $agent_host:8080 + + + + + + + Parallel_Tests + + + ParallelTest_A_Test + pnunit.tests.dll + TestLibraries.ParallelExample.ParallelTest_A + $agent_host:8080 + + + 2 + + + + ParallelTest_B_Test + pnunit.tests.dll + TestLibraries.ParallelExample.ParallelTest_B + $agent_host:8080 + + 1 + + + + + + + + + Parallel_Barriers + + + Parallel_Barriers_TestA + pnunit.tests.dll + TestLibraries.ParallelExampleWithBarriers.ParallelTestWithBarriersA + $agent_host:8080 + + + + START_BARRIER + WAIT_BARRIER + + + + Parallel_Barriers_TestB + pnunit.tests.dll + TestLibraries.ParallelExampleWithBarriers.ParallelTestWithBarriersB + $agent_host:8081 + + + + START_BARRIER + WAIT_BARRIER + + + + + + + + \ No newline at end of file From f91da19b666c66f7931f8ad8245ccb5cf0d932a9 Mon Sep 17 00:00:00 2001 From: Mark Rendle Date: Sat, 1 Nov 2014 00:07:33 +0000 Subject: [PATCH 12/15] So very, very broken --- .gitignore | 1 + .../PerformanceTestConsole.csproj | 9 + .../Simple.Data.Ado.Test.csproj | 9 + .../AdoAdapter.IAdapterWithFunctions.cs | 10 +- src/Simple.Data.Ado/AdoAdapter.cs | 175 +++---- src/Simple.Data.Ado/AdoAdapterFinder.cs | 13 +- src/Simple.Data.Ado/AdoAdapterInserter.cs | 3 +- src/Simple.Data.Ado/AdoAdapterQueryRunner.cs | 76 +-- src/Simple.Data.Ado/BulkInserter.cs | 7 +- src/Simple.Data.Ado/BulkInserterHelper.cs | 37 +- .../BulkInserterTransactionHelper.cs | 23 +- src/Simple.Data.Ado/DataReaderEnumerable.cs | 13 + .../DataReaderMultipleEnumerator.cs | 13 +- src/Simple.Data.Ado/DbCommandExtensions.cs | 5 +- src/Simple.Data.Ado/DbConnectionEx.cs | 11 + src/Simple.Data.Ado/DeleteExecutor.cs | 6 +- src/Simple.Data.Ado/ExecutorFactory.cs | 12 +- src/Simple.Data.Ado/FunctionExecutor.cs | 5 +- src/Simple.Data.Ado/IBulkInserter.cs | 3 +- src/Simple.Data.Ado/ICommandExecutor.cs | 45 ++ src/Simple.Data.Ado/IDbConnectionAsync.cs | 219 +++++++++ src/Simple.Data.Ado/InsertExecutor.cs | 7 +- src/Simple.Data.Ado/ProcedureExecutor.cs | 20 +- src/Simple.Data.Ado/QueryBuilder.cs | 4 +- src/Simple.Data.Ado/QueryBuilderBase.cs | 2 +- src/Simple.Data.Ado/QueryExecutor.cs | 7 +- src/Simple.Data.Ado/Simple.Data.Ado.csproj | 3 + src/Simple.Data.Ado/Sql/Select.cs | 34 ++ .../UpdateByCriteriaExecutor.cs | 5 +- src/Simple.Data.Ado/UpdateEntityExecutor.cs | 5 +- src/Simple.Data.BehaviourTest/FindTest.cs | 83 ++-- .../Simple.Data.BehaviourTest.csproj | 21 + src/Simple.Data.BehaviourTest/packages.config | 4 + .../Simple.Data.GraphTest.csproj | 9 + .../Simple.Data.InMemoryTest.csproj | 9 + .../Simple.Data.Migrations.Tests.csproj | 9 + .../Simple.Data.SqlCe40.csproj | 9 + .../Simple.Data.SqlCe40Test.csproj | 12 +- .../Simple.Data.SqlServer.csproj | 1 + .../SqlCommandExecutor.cs | 42 ++ .../Simple.Data.SqlTest.csproj | 9 + .../Simple.Data.TestHelper.csproj | 9 + .../Simple.Data.UnitTest.csproj | 9 + src/Simple.Data.sln | 76 +-- src/Simple.Data/Adapter.cs | 3 +- .../Commands/CommandResultAwaitable.cs | 34 ++ src/Simple.Data/Commands/DeleteAllCommand.cs | 13 +- src/Simple.Data/Commands/DeleteByCommand.cs | 3 +- src/Simple.Data/Commands/FindByCommand.cs | 47 +- src/Simple.Data/Commands/FindCommand.cs | 4 +- src/Simple.Data/Commands/GetCommand.cs | 20 +- src/Simple.Data/Commands/InsertCommand.cs | 55 ++- src/Simple.Data/Commands/UpsertCommand.cs | 12 +- src/Simple.Data/DatabaseRunner.cs | 3 +- src/Simple.Data/DynamicTable.cs | 13 - src/Simple.Data/IAdapterWithTransactions.cs | 4 +- src/Simple.Data/InMemoryAdapter.cs | 452 ------------------ .../InMemoryAdapterIAdapterWithRelation.cs | 54 --- ...InMemoryAdapterIAdapterWithTransactions.cs | 53 -- src/Simple.Data/RunStrategy.cs | 3 +- src/Simple.Data/Simple.Data.csproj | 4 +- src/Simple.Data/SimpleQuery.cs | 169 ++++--- src/Simple.Data/TransactionRunner.cs | 3 +- 63 files changed, 945 insertions(+), 1088 deletions(-) create mode 100644 src/Simple.Data.Ado/ICommandExecutor.cs create mode 100644 src/Simple.Data.Ado/IDbConnectionAsync.cs create mode 100644 src/Simple.Data.Ado/Sql/Select.cs create mode 100644 src/Simple.Data.SqlServer/SqlCommandExecutor.cs create mode 100644 src/Simple.Data/Commands/CommandResultAwaitable.cs delete mode 100644 src/Simple.Data/InMemoryAdapter.cs delete mode 100644 src/Simple.Data/InMemoryAdapterIAdapterWithRelation.cs delete mode 100644 src/Simple.Data/InMemoryAdapterIAdapterWithTransactions.cs diff --git a/.gitignore b/.gitignore index 95e19452..1bbde524 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ packages/Modernizr.2.5.3/ packages/jQuery.1.7.1.1/ packages/jQuery.UI.Combined.1.8.20.1/ packages/jQuery.Validation.1.9.0.1/ +src/packages Simple.Data.sln.ide TestResult.xml build diff --git a/src/PerformanceTestConsole/PerformanceTestConsole.csproj b/src/PerformanceTestConsole/PerformanceTestConsole.csproj index a699e514..c1ff0ca1 100644 --- a/src/PerformanceTestConsole/PerformanceTestConsole.csproj +++ b/src/PerformanceTestConsole/PerformanceTestConsole.csproj @@ -14,6 +14,8 @@ 512 + ..\ + true x86 @@ -68,6 +70,13 @@ + + + + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + +

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򥻅ziAJisV89-1Cno*pbm>f*tH4{2JB@Z>!_AV>`6 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