From cf4781153ea03db41ab6a2a20a719989eeb93a3f Mon Sep 17 00:00:00 2001 From: Shannon Deminick Date: Fri, 22 Feb 2013 04:12:24 +0600 Subject: [PATCH] Fixes: #U4-873, #U4-888 - fixes media sorting in razor + MVC. Updates Nunit libs and Examine lib. Adds unit tests to support new sorting fixes. Fixes up a few other issues with the legacy ExamineBackedMedia class, it will now handle all data stored in Examine. Simplifies the Examine internal index sets to include all data. --- lib/Examine.dll | Bin 82432 -> 0 bytes src/Umbraco.Tests/Masterpages/dummy.txt | 1 - .../LegacyExamineBackedMediaTests.cs | 82 + .../PublishedContent/PublishedMediaTests.cs | 52 +- .../ExamineHelpers/IndexInitializer.cs | 97 +- .../TestHelpers/ExamineHelpers/media.xml | 6 +- src/Umbraco.Tests/Umbraco.Tests.csproj | 11 +- src/Umbraco.Tests/Views/dummy.txt | 1 - src/Umbraco.Tests/packages.config | 4 +- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 12 - .../config/ExamineIndex.Release.config | 30 +- src/Umbraco.Web.UI/config/ExamineIndex.config | 33 +- src/Umbraco.Web/DefaultPublishedMediaStore.cs | 67 +- src/Umbraco.Web/Umbraco.Web.csproj | 10 +- src/Umbraco.Web/packages.config | 3 + .../NUnit.2.6.0.12054/NUnit.2.6.0.12054.nupkg | Bin 93979 -> 0 bytes .../NUnit.2.6.0.12054/lib/fork-readme.txt | 4 - .../NUnit.2.6.0.12054/lib/nunit.framework.dll | Bin 139264 -> 0 bytes .../NUnit.2.6.0.12054/lib/nunit.framework.xml | 10845 ---------------- src/packages/NUnit.2.6.0.12054/license.txt | 15 - src/packages/repositories.config | 1 + .../RazorDynamicNode/ExamineBackedMedia.cs | 250 +- src/umbraco.MacroEngines/packages.config | 6 + .../umbraco.MacroEngines.csproj | 15 +- 24 files changed, 407 insertions(+), 11138 deletions(-) delete mode 100644 lib/Examine.dll delete mode 100644 src/Umbraco.Tests/Masterpages/dummy.txt create mode 100644 src/Umbraco.Tests/PublishedContent/LegacyExamineBackedMediaTests.cs delete mode 100644 src/Umbraco.Tests/Views/dummy.txt delete mode 100644 src/packages/NUnit.2.6.0.12054/NUnit.2.6.0.12054.nupkg delete mode 100644 src/packages/NUnit.2.6.0.12054/lib/fork-readme.txt delete mode 100644 src/packages/NUnit.2.6.0.12054/lib/nunit.framework.dll delete mode 100644 src/packages/NUnit.2.6.0.12054/lib/nunit.framework.xml delete mode 100644 src/packages/NUnit.2.6.0.12054/license.txt create mode 100644 src/umbraco.MacroEngines/packages.config diff --git a/lib/Examine.dll b/lib/Examine.dll deleted file mode 100644 index 917f9c31093e7368eed7c6768e0a5eb1e60c85b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82432 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 a=0`Jr_P@QDH$c&~{b!T?|I~k<68Ik-dK0<; diff --git a/src/Umbraco.Tests/Masterpages/dummy.txt b/src/Umbraco.Tests/Masterpages/dummy.txt deleted file mode 100644 index 9c01dce8f4..0000000000 --- a/src/Umbraco.Tests/Masterpages/dummy.txt +++ /dev/null @@ -1 +0,0 @@ -This file is just here to make sure the directory gets created. \ No newline at end of file diff --git a/src/Umbraco.Tests/PublishedContent/LegacyExamineBackedMediaTests.cs b/src/Umbraco.Tests/PublishedContent/LegacyExamineBackedMediaTests.cs new file mode 100644 index 0000000000..0c4dc28f83 --- /dev/null +++ b/src/Umbraco.Tests/PublishedContent/LegacyExamineBackedMediaTests.cs @@ -0,0 +1,82 @@ +using System; +using System.IO; +using System.Linq; +using Lucene.Net.Documents; +using NUnit.Framework; +using Umbraco.Core.Configuration; +using Umbraco.Tests.TestHelpers.ExamineHelpers; +using umbraco.MacroEngines; + +namespace Umbraco.Tests.PublishedContent +{ + public class LegacyExamineBackedMediaTests : PublishedContentTestBase + { + public override void Initialize() + { + base.Initialize(); + UmbracoSettings.ForceSafeAliases = true; + UmbracoSettings.UmbracoLibraryCacheDuration = 1800; + UmbracoSettings.ForceSafeAliases = true; + } + + public override void TearDown() + { + base.TearDown(); + } + + [Test] + public void Ensure_Children_Are_Sorted() + { + var newIndexFolder = new DirectoryInfo(Path.Combine("App_Data\\CWSIndexSetTest", Guid.NewGuid().ToString())); + var indexInit = new IndexInitializer(); + var indexer = indexInit.GetUmbracoIndexer(newIndexFolder); + indexer.RebuildIndex(); + + var searcher = indexInit.GetUmbracoSearcher(newIndexFolder); + var result = searcher.Search(searcher.CreateSearchCriteria().Id(1111).Compile()); + Assert.IsNotNull(result); + Assert.AreEqual(1, result.TotalItemCount); + + var searchItem = result.First(); + var backedMedia = new ExamineBackedMedia(searchItem, indexer, searcher); + var children = backedMedia.ChildrenAsList.Value; + + var currSort = 0; + for (var i = 0; i < children.Count(); i++) + { + Assert.GreaterOrEqual(children[i].SortOrder, currSort); + currSort = children[i].SortOrder; + } + + } + + [Test] + public void Ensure_Result_Has_All_Values() + { + var newIndexFolder = new DirectoryInfo(Path.Combine("App_Data\\CWSIndexSetTest", Guid.NewGuid().ToString())); + var indexInit = new IndexInitializer(); + var indexer = indexInit.GetUmbracoIndexer(newIndexFolder); + indexer.RebuildIndex(); + + var searcher = indexInit.GetUmbracoSearcher(newIndexFolder); + var result = searcher.Search(searcher.CreateSearchCriteria().Id(1111).Compile()); + Assert.IsNotNull(result); + Assert.AreEqual(1, result.TotalItemCount); + + var searchItem = result.First(); + var backedMedia = new ExamineBackedMedia(searchItem, indexer, searcher); + + Assert.AreEqual(searchItem.Id, backedMedia.Id); + Assert.AreEqual(searchItem.Fields["sortOrder"], backedMedia.SortOrder.ToString()); + Assert.AreEqual(searchItem.Fields["urlName"], backedMedia.UrlName); + Assert.AreEqual(DateTools.StringToDate(searchItem.Fields["createDate"]), backedMedia.CreateDate); + Assert.AreEqual(DateTools.StringToDate(searchItem.Fields["updateDate"]), backedMedia.UpdateDate); + Assert.AreEqual(Guid.Parse(searchItem.Fields["version"]), backedMedia.Version); + Assert.AreEqual(searchItem.Fields["level"], backedMedia.Level.ToString()); + Assert.AreEqual(searchItem.Fields["writerID"], backedMedia.WriterID.ToString()); + Assert.AreEqual(searchItem.Fields["writerID"], backedMedia.CreatorID.ToString()); //there's only writerId in the xml + Assert.AreEqual(searchItem.Fields["writerName"], backedMedia.CreatorName); + Assert.AreEqual(searchItem.Fields["writerName"], backedMedia.WriterName); //tehre's only writer name in the xml + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs index 75868e373d..e772e418ea 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs @@ -24,10 +24,10 @@ using System.Linq; namespace Umbraco.Tests.PublishedContent { - /// + /// /// Tests the typed extension methods on IPublishedContent using the DefaultPublishedMediaStore /// - [TestFixture] + [TestFixture, RequiresSTA] public class PublishedMediaTests : PublishedContentTestBase { @@ -64,7 +64,33 @@ namespace Umbraco.Tests.PublishedContent return GetNode(id, GetUmbracoContext("/test", 1234)); } - [Test] + [Test] + public void Ensure_Children_Sorted_With_Examine() + { + var newIndexFolder = new DirectoryInfo(Path.Combine("App_Data\\CWSIndexSetTest", Guid.NewGuid().ToString())); + var indexInit = new IndexInitializer(); + var indexer = indexInit.GetUmbracoIndexer(newIndexFolder); + indexer.RebuildIndex(); + + var store = new DefaultPublishedMediaStore( + indexInit.GetUmbracoSearcher(newIndexFolder), + indexInit.GetUmbracoIndexer(newIndexFolder)); + + //we are using the media.xml media to test the examine results implementation, see the media.xml file in the ExamineHelpers namespace + var publishedMedia = store.GetDocumentById(GetUmbracoContext("/test", 1234), 1111); + var rootChildren = publishedMedia.Children().ToArray(); + var currSort = 0; + for (var i = 0; i < rootChildren.Count(); i++) + { + Assert.GreaterOrEqual(rootChildren[i].SortOrder, currSort); + currSort = rootChildren[i].SortOrder; + } + + + + } + + [Test] public void Children_With_Examine() { var newIndexFolder = new DirectoryInfo(Path.Combine("App_Data\\CWSIndexSetTest", Guid.NewGuid().ToString())); @@ -72,7 +98,9 @@ namespace Umbraco.Tests.PublishedContent var indexer = indexInit.GetUmbracoIndexer(newIndexFolder); indexer.RebuildIndex(); - var store = new DefaultPublishedMediaStore(indexInit.GetUmbracoSearcher(newIndexFolder)); + var store = new DefaultPublishedMediaStore( + indexInit.GetUmbracoSearcher(newIndexFolder), + indexInit.GetUmbracoIndexer(newIndexFolder)); //we are using the media.xml media to test the examine results implementation, see the media.xml file in the ExamineHelpers namespace var publishedMedia = store.GetDocumentById(GetUmbracoContext("/test", 1234), 1111); @@ -92,7 +120,9 @@ namespace Umbraco.Tests.PublishedContent var indexer = indexInit.GetUmbracoIndexer(newIndexFolder); indexer.RebuildIndex(); - var store = new DefaultPublishedMediaStore(indexInit.GetUmbracoSearcher(newIndexFolder)); + var store = new DefaultPublishedMediaStore( + indexInit.GetUmbracoSearcher(newIndexFolder), + indexInit.GetUmbracoIndexer(newIndexFolder)); //we are using the media.xml media to test the examine results implementation, see the media.xml file in the ExamineHelpers namespace var publishedMedia = store.GetDocumentById(GetUmbracoContext("/test", 1234), 1111); @@ -112,7 +142,9 @@ namespace Umbraco.Tests.PublishedContent var indexer = indexInit.GetUmbracoIndexer(newIndexFolder); indexer.RebuildIndex(); - var store = new DefaultPublishedMediaStore(indexInit.GetUmbracoSearcher(newIndexFolder)); + var store = new DefaultPublishedMediaStore( + indexInit.GetUmbracoSearcher(newIndexFolder), + indexInit.GetUmbracoIndexer(newIndexFolder)); //we are using the media.xml media to test the examine results implementation, see the media.xml file in the ExamineHelpers namespace var publishedMedia = store.GetDocumentById(GetUmbracoContext("/test", 1234), 1111); @@ -132,7 +164,9 @@ namespace Umbraco.Tests.PublishedContent var indexer = indexInit.GetUmbracoIndexer(newIndexFolder); indexer.RebuildIndex(); - var store = new DefaultPublishedMediaStore(indexInit.GetUmbracoSearcher(newIndexFolder)); + var store = new DefaultPublishedMediaStore( + indexInit.GetUmbracoSearcher(newIndexFolder), + indexInit.GetUmbracoIndexer(newIndexFolder)); //we are using the media.xml media to test the examine results implementation, see the media.xml file in the ExamineHelpers namespace var publishedMedia = store.GetDocumentById(GetUmbracoContext("/test", 1234), 3113); @@ -148,7 +182,9 @@ namespace Umbraco.Tests.PublishedContent var indexer = indexInit.GetUmbracoIndexer(newIndexFolder); indexer.RebuildIndex(); - var store = new DefaultPublishedMediaStore(indexInit.GetUmbracoSearcher(newIndexFolder)); + var store = new DefaultPublishedMediaStore( + indexInit.GetUmbracoSearcher(newIndexFolder), + indexInit.GetUmbracoIndexer(newIndexFolder)); //we are using the media.xml media to test the examine results implementation, see the media.xml file in the ExamineHelpers namespace var publishedMedia = store.GetDocumentById(GetUmbracoContext("/test", 1234), 3113); diff --git a/src/Umbraco.Tests/TestHelpers/ExamineHelpers/IndexInitializer.cs b/src/Umbraco.Tests/TestHelpers/ExamineHelpers/IndexInitializer.cs index bf295d7211..f998f28ddc 100644 --- a/src/Umbraco.Tests/TestHelpers/ExamineHelpers/IndexInitializer.cs +++ b/src/Umbraco.Tests/TestHelpers/ExamineHelpers/IndexInitializer.cs @@ -48,37 +48,35 @@ namespace Umbraco.Tests.TestHelpers.ExamineHelpers new[] { new TestIndexField { Name = "id", EnableSorting = true, Type = "Number" }, - new TestIndexField { Name = "nodeName", EnableSorting = true }, + new TestIndexField { Name = "version" }, + new TestIndexField { Name = "parentID" }, + new TestIndexField { Name = "level" }, + new TestIndexField { Name = "writerID" }, + new TestIndexField { Name = "creatorID" }, + new TestIndexField { Name = "nodeType" }, + new TestIndexField { Name = "template" }, + new TestIndexField { Name = "sortOrder", EnableSorting = true, Type = "Number"}, + new TestIndexField { Name = "createDate", EnableSorting = true, Type = "DateTime" }, new TestIndexField { Name = "updateDate", EnableSorting = true, Type = "DateTime" }, + new TestIndexField { Name = "nodeName", EnableSorting = true }, + new TestIndexField { Name = "urlName" }, new TestIndexField { Name = "writerName" }, - new TestIndexField { Name = "path" }, + new TestIndexField { Name = "creatorName" }, new TestIndexField { Name = "nodeTypeAlias" }, - new TestIndexField { Name = "parentID" } + new TestIndexField { Name = "path" } }, - Enumerable.Empty(), - //new[] - // { - // new TestIndexField { Name = "headerText" }, - // new TestIndexField { Name = "bodyText" }, - // new TestIndexField { Name = "metaDescription" }, - // new TestIndexField { Name = "metaKeywords" }, - // new TestIndexField { Name = "bodyTextColOne" }, - // new TestIndexField { Name = "bodyTextColTwo" }, - // new TestIndexField { Name = "xmlStorageTest" } - // }, - Enumerable.Empty(), - //new[] - // { - // "CWS_Home", - // "CWS_Textpage", - // "CWS_TextpageTwoCol", - // "CWS_NewsEventsList", - // "CWS_NewsItem", - // "CWS_Gallery", - // "CWS_EventItem", - // "Image", - // }, - new string[] { }, + new[] + { + new TestIndexField { Name = "headerText" }, + new TestIndexField { Name = "bodyText" }, + new TestIndexField { Name = "metaDescription" }, + new TestIndexField { Name = "metaKeywords" }, + new TestIndexField { Name = "bodyTextColOne" }, + new TestIndexField { Name = "bodyTextColTwo" }, + new TestIndexField { Name = "xmlStorageTest" } + }, + Enumerable.Empty(), + Enumerable.Empty(), -1), d, new TestDataService(), @@ -95,53 +93,12 @@ namespace Umbraco.Tests.TestHelpers.ExamineHelpers { return new UmbracoExamineSearcher(d, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29)); } - //public SimpleDataIndexer GetSimpleIndexer(DirectoryInfo d) - //{ - // var i = new SimpleDataIndexer(new IndexCriteria( - // new IIndexField[] { }, - // new[] - // { - // new TestIndexField { Name = "Author" }, - // new TestIndexField { Name = "DateCreated", EnableSorting = true, Type = "DateTime" }, - // new TestIndexField { Name = "Title" }, - // new TestIndexField { Name = "Photographer" }, - // new TestIndexField { Name = "YearCreated", Type = "Date.Year" }, - // new TestIndexField { Name = "MonthCreated", Type = "Date.Month" }, - // new TestIndexField { Name = "DayCreated", Type = "Date.Day" }, - // new TestIndexField { Name = "HourCreated", Type = "Date.Hour" }, - // new TestIndexField { Name = "MinuteCreated", Type = "Date.Minute" }, - // new TestIndexField { Name = "SomeNumber", Type = "Number" }, - // new TestIndexField { Name = "SomeFloat", Type = "Float" }, - // new TestIndexField { Name = "SomeDouble", Type = "Double" }, - // new TestIndexField { Name = "SomeLong", Type = "Long" } - // }, - // new string[] { }, - // new string[] { }, - // -1), - // d, - // new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), - // new TestSimpleDataProvider(), - // new[] { "Documents", "Pictures" }, - // false); - // i.IndexingError += IndexingError; - - // return i; - //} + public LuceneSearcher GetLuceneSearcher(DirectoryInfo d) { return new LuceneSearcher(d, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29)); } - //public PDFIndexer GetPdfIndexer(DirectoryInfo d) - //{ - // var i = new PDFIndexer(d, - // new TestDataService(), - // new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), - // false); - - // i.IndexingError += IndexingError; - - // return i; - //} + public MultiIndexSearcher GetMultiSearcher(DirectoryInfo pdfDir, DirectoryInfo simpleDir, DirectoryInfo conventionDir, DirectoryInfo cwsDir) { var i = new MultiIndexSearcher(new[] { pdfDir, simpleDir, conventionDir, cwsDir }, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29)); diff --git a/src/Umbraco.Tests/TestHelpers/ExamineHelpers/media.xml b/src/Umbraco.Tests/TestHelpers/ExamineHelpers/media.xml index dd645c6d71..c605f16dc2 100644 --- a/src/Umbraco.Tests/TestHelpers/ExamineHelpers/media.xml +++ b/src/Umbraco.Tests/TestHelpers/ExamineHelpers/media.xml @@ -26,21 +26,21 @@ 10726 jpg - + 115 268 10726 jpg - + 115 268 10726 jpg - + 115 268 diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index fbeaabf9a1..35f4e00c02 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -31,8 +31,9 @@ 4 - - ..\packages\Examine.0.1.42.2941\lib\Examine.dll + + False + ..\packages\Examine.0.1.46.2941\lib\Examine.dll ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll @@ -43,8 +44,9 @@ ..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll - - ..\packages\NUnit.2.6.0.12054\lib\nunit.framework.dll + + False + ..\packages\NUnit.2.6.2\lib\nunit.framework.dll ..\packages\RhinoMocks.3.6.1\lib\net\Rhino.Mocks.dll @@ -67,6 +69,7 @@ + diff --git a/src/Umbraco.Tests/Views/dummy.txt b/src/Umbraco.Tests/Views/dummy.txt deleted file mode 100644 index 9c01dce8f4..0000000000 --- a/src/Umbraco.Tests/Views/dummy.txt +++ /dev/null @@ -1 +0,0 @@ -This file is just here to make sure the directory gets created. \ No newline at end of file diff --git a/src/Umbraco.Tests/packages.config b/src/Umbraco.Tests/packages.config index 636d175752..5daaf3d507 100644 --- a/src/Umbraco.Tests/packages.config +++ b/src/Umbraco.Tests/packages.config @@ -1,9 +1,9 @@  - + - + diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index 876bc83dd9..b44f39db75 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -101,25 +101,13 @@ False ..\..\lib\CookComputing.XmlRpcV2.dll - - False - ..\..\lib\Examine.dll - False ..\..\lib\HtmlAgilityPack.dll - - False - ..\..\lib\ICSharpCode.SharpZipLib.dll - ..\packages\log4net.2.0.0\lib\net40-full\log4net.dll - - False - ..\..\lib\Lucene.Net.dll - ..\..\lib\WebPages\Microsoft.Web.Helpers.dll diff --git a/src/Umbraco.Web.UI/config/ExamineIndex.Release.config b/src/Umbraco.Web.UI/config/ExamineIndex.Release.config index ce180cd9c2..4d0c38c59c 100644 --- a/src/Umbraco.Web.UI/config/ExamineIndex.Release.config +++ b/src/Umbraco.Web.UI/config/ExamineIndex.Release.config @@ -8,36 +8,10 @@ More information and documentation can be found on CodePlex: http://umbracoexami --> - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + diff --git a/src/Umbraco.Web.UI/config/ExamineIndex.config b/src/Umbraco.Web.UI/config/ExamineIndex.config index c9d2eece88..c702172079 100644 --- a/src/Umbraco.Web.UI/config/ExamineIndex.config +++ b/src/Umbraco.Web.UI/config/ExamineIndex.config @@ -8,35 +8,8 @@ More information and documentation can be found on CodePlex: http://umbracoexami --> - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/Umbraco.Web/DefaultPublishedMediaStore.cs b/src/Umbraco.Web/DefaultPublishedMediaStore.cs index 4b0909936f..d059574397 100644 --- a/src/Umbraco.Web/DefaultPublishedMediaStore.cs +++ b/src/Umbraco.Web/DefaultPublishedMediaStore.cs @@ -9,9 +9,11 @@ using Examine.Providers; using Lucene.Net.Documents; using Umbraco.Core; using Umbraco.Core.Dynamics; +using Umbraco.Core.Logging; using Umbraco.Core.Models; using umbraco; using umbraco.cms.businesslogic; +using Examine.LuceneEngine.SearchCriteria; namespace Umbraco.Web { @@ -28,16 +30,19 @@ namespace Umbraco.Web { } - /// - /// Generally used for unit testing to use an explicit examine searcher - /// - /// - internal DefaultPublishedMediaStore(BaseSearchProvider searchProvider) + /// + /// Generally used for unit testing to use an explicit examine searcher + /// + /// + /// + internal DefaultPublishedMediaStore(BaseSearchProvider searchProvider, BaseIndexProvider indexProvider) { - _searchProvider = searchProvider; + _searchProvider = searchProvider; + _indexProvider = indexProvider; } - private readonly BaseSearchProvider _searchProvider; + private readonly BaseSearchProvider _searchProvider; + private readonly BaseIndexProvider _indexProvider; public virtual IPublishedContent GetDocumentById(UmbracoContext umbracoContext, int nodeId) { @@ -71,7 +76,29 @@ namespace Umbraco.Web } } - private BaseSearchProvider GetSearchProviderSafe() + private BaseIndexProvider GetIndexProviderSafe() + { + if (_indexProvider != null) + return _indexProvider; + + var eMgr = GetExamineManagerSafe(); + if (eMgr != null) + { + try + { + //by default use the InternalSearcher + return eMgr.IndexProviderCollection["InternalIndexer"]; + } + catch (Exception ex) + { + LogHelper.Error("Could not retreive the InternalIndexer", ex); + //something didn't work, continue returning null. + } + } + return null; + } + + private BaseSearchProvider GetSearchProviderSafe() { if (_searchProvider != null) return _searchProvider; @@ -306,11 +333,29 @@ namespace Umbraco.Web { //first check in Examine as this is WAY faster var criteria = searchProvider.CreateSearchCriteria("media"); - var filter = criteria.ParentId(parentId); - var results = searchProvider.Search(filter.Compile()); + var filter = criteria.ParentId(parentId); + ISearchResults results; + + //we want to check if the indexer for this searcher has "sortOrder" flagged as sortable. + //if so, we'll use Lucene to do the sorting, if not we'll have to manually sort it (slower). + var indexer = GetIndexProviderSafe(); + var useLuceneSort = indexer != null && indexer.IndexerData.StandardFields.Any(x => x.Name.InvariantEquals("sortOrder") && x.EnableSorting); + if (useLuceneSort) + { + //we have a sortOrder field declared to be sorted, so we'll use Examine + results = searchProvider.Search( + filter.And().OrderBy(new SortableField("sortOrder", SortType.Int)).Compile()); + } + else + { + results = searchProvider.Search(filter.Compile()); + } + if (results.Any()) { - return results.Select(ConvertFromSearchResult); + return useLuceneSort + ? results.Select(ConvertFromSearchResult) //will already be sorted by lucene + : results.Select(ConvertFromSearchResult).OrderBy(x => x.SortOrder); } } catch (FileNotFoundException) diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 051977688a..e354b7ec26 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -94,21 +94,21 @@ False ..\..\lib\CookComputing.XmlRpcV2.dll - + False - ..\..\lib\Examine.dll + ..\packages\Examine.0.1.46.2941\lib\Examine.dll False ..\..\lib\HtmlAgilityPack.dll - + False - ..\..\lib\ICSharpCode.SharpZipLib.dll + ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll False - ..\..\lib\Lucene.Net.dll + ..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll diff --git a/src/Umbraco.Web/packages.config b/src/Umbraco.Web/packages.config index 8343790db4..f40e1ac15a 100644 --- a/src/Umbraco.Web/packages.config +++ b/src/Umbraco.Web/packages.config @@ -1,5 +1,8 @@  + + + \ No newline at end of file diff --git a/src/packages/NUnit.2.6.0.12054/NUnit.2.6.0.12054.nupkg b/src/packages/NUnit.2.6.0.12054/NUnit.2.6.0.12054.nupkg deleted file mode 100644 index b2bfd1269792f655b945c20ca12d1694932912f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93979 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%0Ai>i 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 C2nYWF diff --git a/src/packages/NUnit.2.6.0.12054/lib/nunit.framework.xml b/src/packages/NUnit.2.6.0.12054/lib/nunit.framework.xml deleted file mode 100644 index 45ef7e7b60..0000000000 --- a/src/packages/NUnit.2.6.0.12054/lib/nunit.framework.xml +++ /dev/null @@ -1,10845 +0,0 @@ - - - - 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. - - - - - 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. - - The result. - - - - Gets 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 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 - - - - - 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 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 - - - - - - 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 - - - - - 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/src/packages/NUnit.2.6.0.12054/license.txt b/src/packages/NUnit.2.6.0.12054/license.txt deleted file mode 100644 index 724e4652e8..0000000000 --- a/src/packages/NUnit.2.6.0.12054/license.txt +++ /dev/null @@ -1,15 +0,0 @@ -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/src/packages/repositories.config b/src/packages/repositories.config index 11373e2f6a..26c4bb2b63 100644 --- a/src/packages/repositories.config +++ b/src/packages/repositories.config @@ -5,6 +5,7 @@ + diff --git a/src/umbraco.MacroEngines/RazorDynamicNode/ExamineBackedMedia.cs b/src/umbraco.MacroEngines/RazorDynamicNode/ExamineBackedMedia.cs index f8799b454f..992b1c0969 100644 --- a/src/umbraco.MacroEngines/RazorDynamicNode/ExamineBackedMedia.cs +++ b/src/umbraco.MacroEngines/RazorDynamicNode/ExamineBackedMedia.cs @@ -4,6 +4,9 @@ using System.Linq; using System.Text; using System.Xml.XPath; using Examine; +using Examine.LuceneEngine.SearchCriteria; +using Examine.Providers; +using Umbraco.Core; using UmbracoExamine; using Lucene.Net.Documents; using umbraco.interfaces; @@ -15,6 +18,8 @@ namespace umbraco.MacroEngines public class ExamineBackedMedia { + private readonly BaseIndexProvider _indexer; + private readonly BaseSearchProvider _searcher; //Custom properties won't be available public bool WasLoadedFromExamine; @@ -99,6 +104,20 @@ namespace umbraco.MacroEngines Values = result.Fields; WasLoadedFromExamine = true; } + + /// + /// Internal constructor used for unit tests + /// + /// + /// + /// + internal ExamineBackedMedia(SearchResult result, BaseIndexProvider indexer, BaseSearchProvider searcher) + : this(result) + { + _indexer = indexer; + _searcher = searcher; + } + public IProperty LoadCustomPropertyNotFoundInExamine(string alias, out bool propertyExists) { //custom property, not loaded from examine @@ -137,44 +156,26 @@ namespace umbraco.MacroEngines { get { - int parentId = 0; - string value = null; - if (Values.TryGetValue("parentID", out value)) - { - if (int.TryParse(value, out parentId)) - { - return new Lazy(() => { return ExamineBackedMedia.GetUmbracoMedia(parentId); }); - } - } - return null; + var parentId = GetValueAsInt("parentID"); + return parentId != 0 + ? new Lazy(() => GetUmbracoMedia(parentId)) + : null; } } + public int ParentId { get { - int parentId = 0; - if (int.TryParse(Values["parentID"], out parentId)) - { - return parentId; - } - return 0; + return GetValueAsInt("parentID"); } } + public int Id { get { - int id = 0; - string value = null; - if (Values.TryGetValue("id", out value)) - { - if (int.TryParse(value, out id)) - { - return id; - } - } - return 0; + return GetValueAsInt("id"); } } @@ -182,7 +183,7 @@ namespace umbraco.MacroEngines { get { - throw new NotImplementedException(); + return GetValueAsInt("sortOrder"); } } @@ -190,30 +191,23 @@ namespace umbraco.MacroEngines { get { - string value = null; - if (Values.TryGetValue("umbracoFile", out value)) - { - return value; - } - return null; + return GetValueAsString("umbracoFile"); } } public string UrlName { - get { throw new NotImplementedException(); } + get + { + return GetValueAsString("urlName"); + } } public string NodeTypeAlias { get { - string value = null; - if (Values.TryGetValue("nodeTypeAlias", out value)) - { - return value; - } - return null; + return GetValueAsString("nodeTypeAlias"); } } @@ -221,62 +215,56 @@ namespace umbraco.MacroEngines { get { - string value = null; - if (Values.TryGetValue("writerName", out value)) - { - return value; - } - return null; + return GetValueAsString("writerName"); } } public string CreatorName { - get { throw new NotImplementedException(); } + get + { + return GetValueAsString("writerName"); + } } public int WriterID { - get { throw new NotImplementedException(); } + get + { + return GetValueAsInt("writerID"); + } } public int CreatorID { - get { throw new NotImplementedException(); } + get + { + //there is no creator id in xml, so will have to be the same as writer id :( + return GetValueAsInt("writerID"); + } } public string Path { get { - string value = null; - if (Values.TryGetValue("__Path", out value)) - { - return value; - } - return null; + return GetValueAsString("__Path"); } } public DateTime CreateDate { - get { throw new NotImplementedException(); } + get + { + return GetvalueAsDateTime("createDate"); + } } public DateTime UpdateDate { get { - DateTime dt = DateTime.MinValue; - string value = null; - if (Values.TryGetValue("UpdateDate", out value)) - { - if (DateTime.TryParse(value, out dt)) - { - return dt; - } - } - return DateTime.Now; + return GetvalueAsDateTime("updateDate"); } } @@ -284,7 +272,7 @@ namespace umbraco.MacroEngines { get { - throw new NotImplementedException(); + return GetValueAsGuid("version"); } } @@ -292,12 +280,7 @@ namespace umbraco.MacroEngines { get { - string value = null; - if (Values.TryGetValue("umbracoFile", out value)) - { - return value; - } - return null; + return GetValueAsString("umbracoFile"); } } @@ -305,20 +288,87 @@ namespace umbraco.MacroEngines { get { - string value = null; - if (Values.TryGetValue("__Path", out value)) - { - return value.Split(',').Length; - } - return 0; + var level = GetValueAsInt("level"); + if (level != 0) return level; + + //return it based on the path if level is not there + string value; + return Values.TryGetValue("__Path", out value) ? value.Split(',').Length : 0; } } + private BaseIndexProvider GetIndexer() + { + return _indexer ?? ExamineManager.Instance.IndexProviderCollection["InternalIndexer"]; + } + + private BaseSearchProvider GetSearcher() + { + return _searcher ?? ExamineManager.Instance.SearchProviderCollection["InternalSearcher"]; + } + + private DateTime GetvalueAsDateTime(string key) + { + var dt = DateTime.MinValue; + string value = null; + if (Values.TryGetValue(key, out value)) + { + if (DateTime.TryParse(value, out dt)) + { + return dt; + } + //normally dates in lucene are stored with a specific lucnene date format so we'll try to parse that. + try + { + return DateTools.StringToDate(value); + } + catch (FormatException) + { + //it could not be formatted :( + } + } + return dt; + } + + private Guid GetValueAsGuid(string key) + { + string value; + if (Values.TryGetValue(key, out value)) + { + Guid gId; + if (Guid.TryParse(value, out gId)) + { + return gId; + } + } + return Guid.Empty; + } + + private string GetValueAsString(string key) + { + string value; + return Values.TryGetValue(key, out value) ? value : null; + } + + private int GetValueAsInt(string key) + { + var val = 0; + string value; + if (Values.TryGetValue(key, out value)) + { + if (int.TryParse(value, out val)) + { + return val; + } + } + return val; + } + public List PropertiesAsList { get { - string[] internalProperties = new string[] { + var internalProperties = new[] { "id", "nodeName", "updateDate", "writerName", "path", "nodeTypeAlias", "parentID", "__NodeId", "__IndexType", "__Path", "__NodeTypeAlias", "__nodeName" @@ -336,27 +386,37 @@ namespace umbraco.MacroEngines { get { - return new Lazy>(() => - { - return GetChildrenMedia(this.Id); - }); + return new Lazy>(() => GetChildrenMedia(this.Id)); } } - private static List GetChildrenMedia(int ParentId) + + private List GetChildrenMedia(int parentId) { try { //first check in Examine as this is WAY faster - var criteria = ExamineManager.Instance - .SearchProviderCollection["InternalSearcher"] - .CreateSearchCriteria("media"); - var filter = criteria.ParentId(ParentId); - var results = ExamineManager - .Instance.SearchProviderCollection["InternalSearcher"] - .Search(filter.Compile()); + var searcher = GetSearcher(); + var indexer = GetIndexer(); + var criteria = searcher.CreateSearchCriteria("media"); + var filter = criteria.ParentId(parentId); + ISearchResults results; + var useLuceneSort = indexer != null && indexer.IndexerData.StandardFields.Any(x => x.Name.InvariantEquals("sortOrder") && x.EnableSorting); + if (useLuceneSort) + { + //we have a sortOrder field declared to be sorted, so we'll use Examine + results = searcher.Search( + filter.And().OrderBy(new SortableField("sortOrder", SortType.Int)).Compile()); + } + else + { + results = searcher.Search(filter.Compile()); + } + if (results.Any()) { - return results.ToList().ConvertAll(result => new ExamineBackedMedia(result)); + return useLuceneSort + ? results.Select(result => new ExamineBackedMedia(result)).ToList() //will already be sorted by lucene + : results.Select(result => new ExamineBackedMedia(result)).OrderBy(x => x.SortOrder).ToList(); } } catch (FileNotFoundException) @@ -366,12 +426,12 @@ namespace umbraco.MacroEngines //Catch the exception here for the time being, and just fallback to GetMedia } - var media = umbraco.library.GetMedia(ParentId, true); + var media = umbraco.library.GetMedia(parentId, true); if (media != null && media.Current != null) { media.MoveNext(); var children = media.Current.SelectChildren(XPathNodeType.Element); - List mediaList = new List(); + var mediaList = new List(); while (children != null && children.Current != null) { if (children.MoveNext()) diff --git a/src/umbraco.MacroEngines/packages.config b/src/umbraco.MacroEngines/packages.config new file mode 100644 index 0000000000..cf936333f5 --- /dev/null +++ b/src/umbraco.MacroEngines/packages.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/umbraco.MacroEngines/umbraco.MacroEngines.csproj b/src/umbraco.MacroEngines/umbraco.MacroEngines.csproj index 51526ba146..ffd6bcce09 100644 --- a/src/umbraco.MacroEngines/umbraco.MacroEngines.csproj +++ b/src/umbraco.MacroEngines/umbraco.MacroEngines.csproj @@ -39,15 +39,21 @@ 4 - - ..\..\lib\Examine.dll + + False + ..\packages\Examine.0.1.46.2941\lib\Examine.dll ..\..\lib\HtmlAgilityPack.dll False - - ..\..\lib\Lucene.Net.dll + + False + ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll + + + False + ..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll @@ -171,6 +177,7 @@ Designer +