From: <fab...@us...> - 2010-12-15 21:36:31
|
Revision: 5316 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5316&view=rev Author: fabiomaulo Date: 2010-12-15 21:36:23 +0000 (Wed, 15 Dec 2010) Log Message: ----------- EnumerableExtensions (perhaps the place to replace some old stuff) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Util/EnumerableExtensions.cs trunk/nhibernate/src/NHibernate.Test/UtilityTest/EnumerableExtensionsTests/ trunk/nhibernate/src/NHibernate.Test/UtilityTest/EnumerableExtensionsTests/AnyExtensionTests.cs Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-12-15 18:29:52 UTC (rev 5315) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-12-15 21:36:23 UTC (rev 5316) @@ -440,6 +440,7 @@ <Compile Include="Util\ADOExceptionReporter.cs" /> <Compile Include="Util\ArrayHelper.cs" /> <Compile Include="Util\CollectionPrinter.cs" /> + <Compile Include="Util\EnumerableExtensions.cs" /> <Compile Include="Util\IdentityMap.cs" /> <Compile Include="Util\JoinedEnumerable.cs" /> <Compile Include="Util\ObjectUtils.cs" /> Added: trunk/nhibernate/src/NHibernate/Util/EnumerableExtensions.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Util/EnumerableExtensions.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Util/EnumerableExtensions.cs 2010-12-15 21:36:23 UTC (rev 5316) @@ -0,0 +1,75 @@ +using System; +using System.Collections; + +namespace NHibernate.Util +{ + public static class EnumerableExtensions + { + public static bool Any(this IEnumerable source) + { + if (source == null) + { + throw new ArgumentNullException("source"); + } + using (DisposableEnumerator enumerator = source.GetDisposableEnumerator()) + { + if (enumerator.MoveNext()) + { + return true; + } + } + return false; + } + + private static DisposableEnumerator GetDisposableEnumerator(this IEnumerable source) + { + return new DisposableEnumerator(source); + } + + #region Nested type: DisposableEnumerator + + internal class DisposableEnumerator : IDisposable, IEnumerator + { + private readonly IEnumerator wrapped; + + public DisposableEnumerator(IEnumerable source) + { + wrapped = source.GetEnumerator(); + } + + #region IDisposable Members + + public void Dispose() + { + var disposable = wrapped as IDisposable; + if (disposable != null) + { + disposable.Dispose(); + } + } + + #endregion + + #region IEnumerator Members + + public bool MoveNext() + { + return wrapped.MoveNext(); + } + + public void Reset() + { + wrapped.Reset(); + } + + public object Current + { + get { return wrapped.Current; } + } + + #endregion + } + + #endregion + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-12-15 18:29:52 UTC (rev 5315) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-12-15 21:36:23 UTC (rev 5316) @@ -580,6 +580,7 @@ <Compile Include="TypesTest\XDocTypeFixture.cs" /> <Compile Include="TypesTest\XmlDocClass.cs" /> <Compile Include="TypesTest\XmlDocTypeFixture.cs" /> + <Compile Include="UtilityTest\EnumerableExtensionsTests\AnyExtensionTests.cs" /> <Compile Include="UtilityTest\ReflectionHelperIsMethodOfTests.cs" /> <Compile Include="UtilityTest\ReflectionHelperTest.cs" /> <Compile Include="Linq\RegresstionTests.cs" /> Added: trunk/nhibernate/src/NHibernate.Test/UtilityTest/EnumerableExtensionsTests/AnyExtensionTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/UtilityTest/EnumerableExtensionsTests/AnyExtensionTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/UtilityTest/EnumerableExtensionsTests/AnyExtensionTests.cs 2010-12-15 21:36:23 UTC (rev 5316) @@ -0,0 +1,75 @@ +using System; +using System.Collections; +using NUnit.Framework; +using NHibernate.Util; +using SharpTestsEx; + +namespace NHibernate.Test.UtilityTest.EnumerableExtensionsTests +{ + public class AnyExtensionTests + { + [Test] + public void WhenEmptyListThenReturnFalse() + { + (new object[0]).Any().Should().Be.False(); + } + + [Test] + public void WhenNoEmptyListThenReturnTrue() + { + (new object[1]).Any().Should().Be.True(); + } + + private class MyDisposableList: IEnumerable + { + private readonly System.Action enumeratorDisposeCallback; + + public MyDisposableList(System.Action enumeratorDisposeCallback) + { + this.enumeratorDisposeCallback = enumeratorDisposeCallback; + } + + public IEnumerator GetEnumerator() + { + return new EmptyEnumerator(enumeratorDisposeCallback); + } + } + + private class EmptyEnumerator : IEnumerator, IDisposable + { + private readonly System.Action disposeCallback; + + public EmptyEnumerator(System.Action disposeCallback) + { + this.disposeCallback = disposeCallback; + } + + public void Reset() + { + } + + public object Current + { + get { throw new InvalidOperationException("EmptyEnumerator"); } + } + + public bool MoveNext() + { + return false; + } + + public void Dispose() + { + disposeCallback(); + } + } + + [Test] + public void WhenDisposableListThenCallDispose() + { + var disposeCalled = false; + (new MyDisposableList(()=> disposeCalled = true)).Any(); + disposeCalled.Should().Be.True(); + } + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |