// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. namespace System.Data.Entity { using System.Collections.Generic; using System.Data.Entity.Core.Objects; using System.Data.Entity.Infrastructure; using System.Data.Entity.Internal.Linq; using System.Data.Entity.Resources; using System.Linq; using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; using Moq; using Xunit; public class IQueryableExtensionsTests { #region Entity types for Include tests public class RootEntity { public Level1Entity Level1Reference { get; set; } public ICollection Level1Collection { get; set; } public ICollection RootCollection { get; set; } public RootEntity RootReference { get; set; } } public class Level1Entity { public bool BoolProperty { get; set; } public Level2Entity Level2Reference { get; set; } public ICollection Level2Collection { get; set; } public ICollection RootCollection { get; set; } public RootEntity RootReference { get; set; } } public class Level2Entity { public Level3Entity Level3Reference { get; set; } public ICollection Level3Collection { get; set; } public ICollection Level1Collection { get; set; } public Level1Entity Level1Reference { get; set; } } public class Level3Entity { public ICollection Level2Collection { get; set; } public Level2Entity Level2Reference { get; set; } } #endregion public class AsNotracking_Generic { [Fact] public void With_null_source_called_on_extension_method_throws() { Assert.Equal( "source", Assert.Throws(() => IQueryableExtensions.AsNoTracking(null)).ParamName); } [Fact] public void On_ObjectQuery_returns_a_NoTracking_one() { var query = MockHelper.CreateMockObjectQuery(new object()).Object; var newQuery = query.AsNoTracking(); Assert.NotSame(query, newQuery); Assert.NotEqual(MergeOption.NoTracking, query.MergeOption); Assert.Equal(MergeOption.NoTracking, ((ObjectQuery)newQuery).MergeOption); } [Fact] public void On_IEnumerable_does_nothing() { var enumerable = new List { new FakeEntity(), new FakeEntity(), new FakeEntity() }.AsQueryable(); var afterNoTracking = enumerable.AsNoTracking(); Assert.Same(enumerable, afterNoTracking); Assert.Equal(3, afterNoTracking.Count()); } [Fact] public void On_IQueryable_with_no_AsNoTracking_method_does_nothing() { var mockQueryable = new Mock>().Object; var afterAsNoTracking = mockQueryable.AsNoTracking(); Assert.Same(mockQueryable, afterAsNoTracking); } public interface INoTrackingable : IQueryable { INoTrackingable AsNoTracking(); } [Fact] public void On_IQueryable_with_AsNoTracking_method_calls_that_method() { var mockQueryable = new Mock>(MockBehavior.Strict); IQueryable source = mockQueryable.Object; var result = new Mock>().Object; mockQueryable.Setup(i => i.AsNoTracking()).Returns(result); var afterAsNoTracking = source.AsNoTracking(); Assert.Same(result, afterAsNoTracking); } public interface INoTrackingableWithFunnyAsNoTracking : IQueryable { INoTrackingableWithFunnyAsNoTracking AsNoTracking(string buffy, string summers); } [Fact] public void On_IQueryable_with_non_matching_AsNoTracking_is_ignored() { IQueryable source = new Mock>(MockBehavior.Strict).Object; var afterAsNoTracking = source.AsNoTracking(); Assert.Same(source, afterAsNoTracking); } public interface INoTrackingableReturningVoid : IQueryable { void AsNoTracking(); } [Fact] public void On_IQueryable_with_void_AsNoTracking_method_is_ignored() { var mockQueryable = new Mock>(MockBehavior.Strict); var afterAsNoTracking = ((IQueryable)mockQueryable.Object).AsNoTracking(); Assert.Same(mockQueryable.Object, afterAsNoTracking); } public interface INoTrackingableReturningString : IQueryable { string AsNoTracking(); } [Fact] public void On_IQueryable_with_AsNoTracking_returning_string_is_ignored() { IQueryable source = new Mock>(MockBehavior.Strict).Object; var afterAsNoTracking = source.AsNoTracking(); Assert.Same(source, afterAsNoTracking); } } public class AsNotracking_NonGeneric { [Fact] public void With_null_source_called_on_extension_method_throws() { Assert.Equal("source", Assert.Throws(() => IQueryableExtensions.AsNoTracking(null)).ParamName); } [Fact] public void On_ObjectQuery_returns_a_NoTracking_one() { var query = (ObjectQuery)MockHelper.CreateMockObjectQuery(new object()).Object; var newQuery = query.AsNoTracking(); Assert.NotSame(query, newQuery); Assert.NotEqual(MergeOption.NoTracking, query.MergeOption); Assert.Equal(MergeOption.NoTracking, ((ObjectQuery)newQuery).MergeOption); } [Fact] public void On_IEnumerable_does_nothing() { var enumerable = (IQueryable)new List { new FakeEntity(), new FakeEntity(), new FakeEntity() }.AsQueryable(); var afterAsNoTracking = enumerable.AsNoTracking(); Assert.Same(enumerable, afterAsNoTracking); Assert.Equal(3, afterAsNoTracking.ToList().Count()); } [Fact] public void On_IQueryable_with_no_AsNoTracking_method_does_nothing() { var mockQueryable = new Mock().Object; var afterAsNoTracking = mockQueryable.AsNoTracking(); Assert.Same(mockQueryable, afterAsNoTracking); } public interface INoTrackingable : IQueryable { INoTrackingable AsNoTracking(); } [Fact] public void On_IQueryable_with_AsNoTracking_method_calls_that_method() { var mockQueryable = new Mock(MockBehavior.Strict); IQueryable source = mockQueryable.Object; var result = new Mock().Object; mockQueryable.Setup(i => i.AsNoTracking()).Returns(result); var afterAsNoTracking = source.AsNoTracking(); Assert.Same(result, afterAsNoTracking); } public interface INoTrackingableWithFunnyAsNoTracking : IQueryable { INoTrackingableWithFunnyAsNoTracking AsNoTracking(string buffy, string summers); } [Fact] public void On_IQueryable_with_non_matching_AsNoTracking_is_ignored() { IQueryable source = new Mock(MockBehavior.Strict).Object; var afterAsNoTracking = source.AsNoTracking(); Assert.Same(source, afterAsNoTracking); } public interface INoTrackingableReturningVoid : IQueryable { void AsNoTracking(); } [Fact] public void On_IQueryable_with_void_AsNoTracking_method_is_ignored() { var mockQueryable = new Mock(MockBehavior.Strict); var afterAsNoTracking = ((IQueryable)mockQueryable.Object).AsNoTracking(); Assert.Same(mockQueryable.Object, afterAsNoTracking); } public interface INoTrackingableReturningString : IQueryable { string AsNoTracking(); } [Fact] public void On_IQueryable_with_AsNoTracking_returning_string_is_ignored() { IQueryable source = new Mock(MockBehavior.Strict).Object; var afterAsNoTracking = source.AsNoTracking(); Assert.Same(source, afterAsNoTracking); } } public class AsStreaming_Generic { [Fact] public void With_null_source_called_on_extension_method_throws() { Assert.Equal( "source", Assert.Throws(() => IQueryableExtensions.AsStreaming(null)).ParamName); } [Fact] public void On_ObjectQuery_returns_an_AsStreaming_one() { var query = MockHelper.CreateMockObjectQuery(new object()).Object; var newQuery = query.AsStreaming(); Assert.NotSame(query, newQuery); Assert.False(query.Streaming); Assert.True(((ObjectQuery)newQuery).Streaming); } [Fact] public void On_IEnumerable_does_nothing() { var enumerable = new List { new FakeEntity(), new FakeEntity(), new FakeEntity() }.AsQueryable(); var afterAsStreaming = enumerable.AsStreaming(); Assert.Same(enumerable, afterAsStreaming); Assert.Equal(3, afterAsStreaming.Count()); } [Fact] public void On_IQueryable_with_no_AsStreaming_method_does_nothing() { var mockQueryable = new Mock>().Object; var afterAsStreaming = mockQueryable.AsStreaming(); Assert.Same(mockQueryable, afterAsStreaming); } public interface IAsStreamable : IQueryable { IAsStreamable AsStreaming(); } [Fact] public void On_IQueryable_with_AsStreaming_method_calls_that_method() { var mockQueryable = new Mock>(MockBehavior.Strict); IQueryable source = mockQueryable.Object; var result = new Mock>().Object; mockQueryable.Setup(i => i.AsStreaming()).Returns(result); var afterAsStreaming = source.AsStreaming(); Assert.Same(result, afterAsStreaming); } public interface IAsStreamableWithFunnyAsStreaming : IQueryable { IAsStreamableWithFunnyAsStreaming AsStreaming(string buffy, string summers); } [Fact] public void On_IQueryable_with_non_matching_AsStreaming_is_ignored() { IQueryable source = new Mock>(MockBehavior.Strict).Object; var afterAsStreaming = source.AsStreaming(); Assert.Same(source, afterAsStreaming); } public interface IAsStreamableReturningVoid : IQueryable { void AsStreaming(); } [Fact] public void On_IQueryable_with_void_AsStreaming_method_is_ignored() { var mockQueryable = new Mock>(MockBehavior.Strict); var afterAsStreaming = ((IQueryable)mockQueryable.Object).AsStreaming(); Assert.Same(mockQueryable.Object, afterAsStreaming); } public interface IAsStreamableReturningString : IQueryable { string AsStreaming(); } [Fact] public void On_IQueryable_with_AsStreaming_returning_string_is_ignored() { IQueryable source = new Mock>(MockBehavior.Strict).Object; var afterAsStreaming = source.AsStreaming(); Assert.Same(source, afterAsStreaming); } } public class AsStreaming_NonGeneric { [Fact] public void With_null_source_called_on_extension_method_throws() { Assert.Equal("source", Assert.Throws(() => IQueryableExtensions.AsStreaming(null)).ParamName); } [Fact] public void On_ObjectQuery_returns_an_AsStreaming_one() { var query = (ObjectQuery)MockHelper.CreateMockObjectQuery(new object()).Object; var newQuery = query.AsStreaming(); Assert.NotSame(query, newQuery); Assert.False(query.Streaming); Assert.True(((ObjectQuery)newQuery).Streaming); } [Fact] public void On_IEnumerable_does_nothing() { var enumerable = (IQueryable)new List { new FakeEntity(), new FakeEntity(), new FakeEntity() }.AsQueryable(); var afterAsStreaming = enumerable.AsStreaming(); Assert.Same(enumerable, afterAsStreaming); Assert.Equal(3, afterAsStreaming.ToList().Count()); } [Fact] public void On_IQueryable_with_no_AsStreaming_method_does_nothing() { var mockQueryable = new Mock().Object; var afterAsStreaming = mockQueryable.AsStreaming(); Assert.Same(mockQueryable, afterAsStreaming); } public interface IStreamable : IQueryable { IStreamable AsStreaming(); } [Fact] public void On_IQueryable_with_AsStreaming_method_calls_that_method() { var mockQueryable = new Mock(MockBehavior.Strict); IQueryable source = mockQueryable.Object; var result = new Mock().Object; mockQueryable.Setup(i => i.AsStreaming()).Returns(result); var afterAsStreaming = source.AsStreaming(); Assert.Same(result, afterAsStreaming); } public interface IAsStreamableWithFunnyAsStreaming : IQueryable { IAsStreamableWithFunnyAsStreaming AsStreaming(string buffy, string summers); } [Fact] public void On_IQueryable_with_non_matching_AsStreaming_is_ignored() { IQueryable source = new Mock(MockBehavior.Strict).Object; var afterAsStreaming = source.AsStreaming(); Assert.Same(source, afterAsStreaming); } public interface IAsStreamableReturningVoid : IQueryable { void AsStreaming(); } [Fact] public void On_IQueryable_with_void_AsStreaming_method_is_ignored() { var mockQueryable = new Mock(MockBehavior.Strict); var afterAsStreaming = ((IQueryable)mockQueryable.Object).AsStreaming(); Assert.Same(mockQueryable.Object, afterAsStreaming); } public interface IAsStreamableReturningString : IQueryable { string AsStreaming(); } [Fact] public void On_IQueryable_with_AsStreaming_returning_string_is_ignored() { IQueryable source = new Mock(MockBehavior.Strict).Object; var afterAsStreaming = source.AsStreaming(); Assert.Same(source, afterAsStreaming); } } public class Include_Generic { [Fact] public void String_Include_with_null_string_called_on_extension_method_throws() { Assert.Equal( Strings.ArgumentIsNullOrWhitespace("path"), Assert.Throws(() => IQueryableExtensions.Include(new DbQuery(new Mock>().Object), null)).Message); } [Fact] public void String_Include_with_empty_string_called_on_extension_method_throws() { Assert.Equal( Strings.ArgumentIsNullOrWhitespace("path"), Assert.Throws(() => IQueryableExtensions.Include(new DbQuery(new Mock>().Object), "")).Message); } [Fact] public void String_Include_with_whitespace_string_called_on_extension_method_throws() { Assert.Equal( Strings.ArgumentIsNullOrWhitespace("path"), Assert.Throws(() => IQueryableExtensions.Include(new DbQuery(new Mock>().Object), " ")).Message); } [Fact] public void String_Include_with_null_source_called_on_extension_method_throws() { Assert.Equal( "source", Assert.Throws(() => IQueryableExtensions.Include(null, "SomePath")).ParamName); } [Fact] public void String_Include_on_IEnumerable_does_nothing() { var enumerable = new List { new FakeEntity(), new FakeEntity(), new FakeEntity() }.AsQueryable(); var afterInclude = enumerable.Include("FakeRelationship"); Assert.Same(enumerable, afterInclude); Assert.Equal(3, afterInclude.Count()); } [Fact] public void String_Include_on_IQueryable_with_no_Include_method_does_nothing() { var mockQueryable = new Mock>().Object; var afterInclude = mockQueryable.Include("FakeRelationship"); Assert.Same(mockQueryable, afterInclude); } public interface IIncludable : IQueryable { IIncludable Include(string path); } [Fact] public void String_Include_on_IQueryable_with_Include_method_calls_that_method() { var mockQueryable = new Mock>(MockBehavior.Strict); IQueryable source = mockQueryable.Object; var result = new Mock>().Object; mockQueryable.Setup(i => i.Include("FakeRelationship")).Returns(result); var afterInclude = source.Include("FakeRelationship"); Assert.Same(result, afterInclude); } public interface IIncludableWithFunnyInclude : IQueryable { IIncludableWithFunnyInclude Include(string buffy, string summers); } [Fact] public void String_Include_on_IQueryable_with_non_matching_Include_is_ignored() { IQueryable source = new Mock>(MockBehavior.Strict).Object; var afterInclude = source.Include("FakeRelationship"); Assert.Same(source, afterInclude); } public interface IIncludableReturningVoid : IQueryable { void Include(string path); } [Fact] public void String_Include_on_IQueryable_with_void_Include_method_is_ignored() { var mockQueryable = new Mock>(MockBehavior.Strict); var afterInclude = ((IQueryable)mockQueryable.Object).Include("FakeRelationship"); Assert.Same(mockQueryable.Object, afterInclude); } public interface IIncludableReturningString : IQueryable { string Include(string path); } [Fact] public void String_Include_on_IQueryable_with_Include_returning_string_is_ignored() { IQueryable source = new Mock>(MockBehavior.Strict).Object; var afterInclude = source.Include("FakeRelationship"); Assert.Same(source, afterInclude); } [Fact] public void Lambda_Include_can_parse_single_reference_property() { var mockQueryable = new Mock>(); mockQueryable.Object.Include(e => e.Level1Reference); mockQueryable.Verify(i => i.Include("Level1Reference")); } [Fact] public void Lambda_Include_can_parse_single_collection_property() { var mockQueryable = new Mock>(); mockQueryable.Object.Include(e => e.Level1Collection); mockQueryable.Verify(i => i.Include("Level1Collection")); } [Fact] public void Lambda_Include_can_parse_reference_followed_by_reference() { var mockQueryable = new Mock>(); mockQueryable.Object.Include(e => e.Level1Reference.Level2Reference); mockQueryable.Verify(i => i.Include("Level1Reference.Level2Reference")); } [Fact] public void Lambda_Include_can_parse_reference_followed_by_collection() { var mockQueryable = new Mock>(); mockQueryable.Object.Include(e => e.Level1Reference.Level2Collection); mockQueryable.Verify(i => i.Include("Level1Reference.Level2Collection")); } [Fact] public void Lambda_Include_can_parse_collection_followed_by_reference() { var mockQueryable = new Mock>(); mockQueryable.Object.Include(e => e.Level1Collection.Select(l1 => l1.Level2Reference)); mockQueryable.Verify(i => i.Include("Level1Collection.Level2Reference")); } [Fact] public void Lambda_Include_can_parse_collection_followed_by_collection() { var mockQueryable = new Mock>(); mockQueryable.Object.Include(e => e.Level1Collection.Select(l1 => l1.Level2Collection)); mockQueryable.Verify(i => i.Include("Level1Collection.Level2Collection")); } [Fact] public void Lambda_Include_can_parse_reference_followed_by_reference_followed_by_reference() { var mockQueryable = new Mock>(); mockQueryable.Object.Include(e => e.Level1Reference.Level2Reference.Level3Reference); mockQueryable.Verify(i => i.Include("Level1Reference.Level2Reference.Level3Reference")); } [Fact] public void Lambda_Include_can_parse_reference_followed_by_reference_followed_by_collection() { var mockQueryable = new Mock>(); mockQueryable.Object.Include(e => e.Level1Reference.Level2Reference.Level3Collection); mockQueryable.Verify(i => i.Include("Level1Reference.Level2Reference.Level3Collection")); } [Fact] public void Lambda_Include_can_parse_reference_followed_by_collection_followed_by_reference() { var mockQueryable = new Mock>(); mockQueryable.Object.Include(e => e.Level1Reference.Level2Collection.Select(l2 => l2.Level3Reference)); mockQueryable.Verify(i => i.Include("Level1Reference.Level2Collection.Level3Reference")); } [Fact] public void Lambda_Include_can_parse_reference_followed_by_collection_followed_by_collection() { var mockQueryable = new Mock>(); mockQueryable.Object.Include(e => e.Level1Reference.Level2Collection.Select(l2 => l2.Level3Collection)); mockQueryable.Verify(i => i.Include("Level1Reference.Level2Collection.Level3Collection")); } [Fact] public void Lambda_Include_can_parse_collection_followed_by_reference_followed_by_reference() { var mockQueryable = new Mock>(); mockQueryable.Object.Include(e => e.Level1Collection.Select(l1 => l1.Level2Reference.Level3Reference)); mockQueryable.Verify(i => i.Include("Level1Collection.Level2Reference.Level3Reference")); } [Fact] public void Lambda_Include_can_parse_collection_followed_by_reference_followed_by_collection() { var mockQueryable = new Mock>(); mockQueryable.Object.Include(e => e.Level1Collection.Select(l1 => l1.Level2Reference.Level3Collection)); mockQueryable.Verify(i => i.Include("Level1Collection.Level2Reference.Level3Collection")); } [Fact] public void Lambda_Include_can_parse_collection_followed_by_collection_followed_by_reference() { var mockQueryable = new Mock>(); mockQueryable.Object.Include(e => e.Level1Collection.Select(l1 => l1.Level2Collection.Select(l2 => l2.Level3Reference))); mockQueryable.Verify(i => i.Include("Level1Collection.Level2Collection.Level3Reference")); } [Fact] public void Lambda_Include_can_parse_collection_followed_by_collection_followed_by_collection() { var mockQueryable = new Mock>(); mockQueryable.Object.Include(e => e.Level1Collection.Select(l1 => l1.Level2Collection.Select(l2 => l2.Level3Collection))); mockQueryable.Verify(i => i.Include("Level1Collection.Level2Collection.Level3Collection")); } [Fact] public void Lambda_Include_can_parse_a_huge_funky_include_path() { var mockQueryable = new Mock>(); mockQueryable.Object.Include( e => e.RootReference.RootCollection.Select( r => r.Level1Reference.RootReference.Level1Collection.Select( l1 => l1.Level2Collection.Select( l2 => l2.Level3Collection.Select(l3 => l3.Level2Reference.Level1Collection.Select(l1b => l1b.RootReference)))))); mockQueryable.Verify( i => i.Include( "RootReference.RootCollection.Level1Reference.RootReference.Level1Collection.Level2Collection.Level3Collection.Level2Reference.Level1Collection.RootReference")); } [Fact] public void Lambda_Include_with_null_source_called_on_extension_method_throws() { Assert.Equal( "source", Assert.Throws(() => IQueryableExtensions.Include(null, e => e.Id)).ParamName); } [Fact] public void Lambda_Include_with_null_expression_called_on_extension_method_throws() { Assert.Equal( "path", Assert.Throws(() => new DbQuery(new Mock>().Object).Include((Expression>)null)).ParamName); } [Fact] public void Lambda_Include_throws_when_given_fundamentaly_wrong_expression() { Assert.Equal( new ArgumentException(Strings.DbExtensions_InvalidIncludePathExpression, "path").Message, Assert.Throws(() => new DbQuery(new Mock>().Object).Include(e => new object())).Message); } [Fact] public void Lambda_Include_throws_when_given_method_call_expression() { Assert.Equal( new ArgumentException(Strings.DbExtensions_InvalidIncludePathExpression, "path").Message, Assert.Throws(() => new DbQuery(new Mock>().Object).Include(e => e.GetType())).Message); } [Fact] public void Lambda_Include_throws_when_given_second_level_method_call_expression() { Assert.Equal( new ArgumentException(Strings.DbExtensions_InvalidIncludePathExpression, "path").Message, Assert.Throws(() => new DbQuery(new Mock>().Object).Include(e => e.Level1Reference.GetType())).Message); } [Fact] public void Lambda_Include_throws_when_given_first_level_method_call_with_second_level_property() { Assert.Equal( new ArgumentException(Strings.DbExtensions_InvalidIncludePathExpression, "path").Message, Assert.Throws(() => new DbQuery(new Mock>().Object).Include(e => e.Level1Reference.GetType().Assembly)).Message); } [Fact] public void Lambda_Include_throws_when_given_call_to_something_other_than_Select() { Assert.Equal( new ArgumentException(Strings.DbExtensions_InvalidIncludePathExpression, "path").Message, Assert.Throws(() => new DbQuery(new Mock>().Object).Include(e => e.Level1Collection.First())).Message); } [Fact] public void Lambda_Include_throws_when_given_second_level_call_to_something_other_than_Select() { Assert.Equal( new ArgumentException(Strings.DbExtensions_InvalidIncludePathExpression, "path").Message, Assert.Throws(() => new DbQuery(new Mock>().Object) .Include(e => e.Level1Collection.Select(l1 => l1.Level2Collection.Distinct()))).Message); } [Fact] public void Lambda_Include_throws_when_given_first_level_call_to_something_other_than_Select_containing_expression() { Assert.Equal( new ArgumentException(Strings.DbExtensions_InvalidIncludePathExpression, "path").Message, Assert.Throws(() => new DbQuery(new Mock>().Object) .Include(e => e.Level1Collection.Any(l1 => l1.BoolProperty))).Message); } } public class Include_NonGeneric { [Fact] public void Non_generic_String_Include_with_null_string_called_on_extension_method_throws() { Assert.Equal( Strings.ArgumentIsNullOrWhitespace("path"), Assert.Throws(() => IQueryableExtensions.Include(new InternalDbQuery(new Mock>().Object), null)).Message); } [Fact] public void Non_generic_String_Include_with_empty_string_called_on_extension_method_throws() { Assert.Equal( Strings.ArgumentIsNullOrWhitespace("path"), Assert.Throws(() => IQueryableExtensions.Include(new InternalDbQuery(new Mock>().Object), "")).Message); } [Fact] public void Non_generic_String_Include_with_whitespace_string_called_on_extension_method_throws() { Assert.Equal( Strings.ArgumentIsNullOrWhitespace("path"), Assert.Throws(() => IQueryableExtensions.Include(new InternalDbQuery(new Mock>().Object), " ")).Message); } [Fact] public void Non_generic_String_Include_with_null_source_called_on_extension_method_throws() { Assert.Equal("source", Assert.Throws(() => IQueryableExtensions.Include(null, "SomePath")).ParamName); } [Fact] public void Non_generic_String_Include_on_IEnumerable_does_nothing() { var enumerable = (IQueryable)new List { new FakeEntity(), new FakeEntity(), new FakeEntity() }.AsQueryable(); var afterInclude = enumerable.Include("FakeRelationship"); Assert.Same(enumerable, afterInclude); Assert.Equal(3, afterInclude.ToList().Count()); } [Fact] public void Non_generic_String_Include_on_IQueryable_with_no_Include_method_does_nothing() { var mockQueryable = new Mock().Object; var afterInclude = mockQueryable.Include("FakeRelationship"); Assert.Same(mockQueryable, afterInclude); } public interface IIncludable : IQueryable { IIncludable Include(string path); } [Fact] public void Non_generic_String_Include_on_IQueryable_with_Include_method_calls_that_method() { var mockQueryable = new Mock(MockBehavior.Strict); IQueryable source = mockQueryable.Object; var result = new Mock().Object; mockQueryable.Setup(i => i.Include("FakeRelationship")).Returns(result); var afterInclude = source.Include("FakeRelationship"); Assert.Same(result, afterInclude); } public interface IIncludableWithFunnyInclude : IQueryable { IIncludableWithFunnyInclude Include(string buffy, string summers); } [Fact] public void Non_generic_String_Include_on_IQueryable_with_non_matching_Include_is_ignored() { IQueryable source = new Mock(MockBehavior.Strict).Object; var afterInclude = source.Include("FakeRelationship"); Assert.Same(source, afterInclude); } public interface IIncludableReturningVoid : IQueryable { void Include(string path); } [Fact] public void Non_generic_String_Include_on_IQueryable_with_void_Include_method_is_ignored() { var mockQueryable = new Mock(MockBehavior.Strict); var afterInclude = ((IQueryable)mockQueryable.Object).Include("FakeRelationship"); Assert.Same(mockQueryable.Object, afterInclude); } public interface IIncludableReturningString : IQueryable { string Include(string path); } [Fact] public void Non_generic_String_Include_on_IQueryable_with_Include_returning_string_is_ignored() { IQueryable source = new Mock(MockBehavior.Strict).Object; var afterInclude = source.Include("FakeRelationship"); Assert.Same(source, afterInclude); } } #region Async equivalents of IQueryable extension methods #if !NET40 [Fact] public void Extension_methods_validate_arguments() { ArgumentNullTest("source", () => IQueryableExtensions.FirstAsync(null)); ArgumentNullTest("source", () => IQueryableExtensions.FirstAsync(null, new CancellationToken())); ArgumentNullTest("source", () => IQueryableExtensions.FirstAsync(null, s => true)); ArgumentNullTest("source", () => IQueryableExtensions.FirstAsync(null, s => true, new CancellationToken())); ArgumentNullTest("predicate", () => Source().FirstAsync(null)); ArgumentNullTest("predicate", () => Source().FirstAsync(null, new CancellationToken())); ArgumentNullTest("source", () => IQueryableExtensions.FirstOrDefaultAsync(null)); ArgumentNullTest("source", () => IQueryableExtensions.FirstOrDefaultAsync(null, new CancellationToken())); ArgumentNullTest("source", () => IQueryableExtensions.FirstOrDefaultAsync(null, s => true)); ArgumentNullTest("source", () => IQueryableExtensions.FirstOrDefaultAsync(null, s => true, new CancellationToken())); ArgumentNullTest("predicate", () => Source().FirstOrDefaultAsync(null)); ArgumentNullTest("predicate", () => Source().FirstOrDefaultAsync(null, new CancellationToken())); ArgumentNullTest("source", () => IQueryableExtensions.SingleAsync(null)); ArgumentNullTest("source", () => IQueryableExtensions.SingleAsync(null, new CancellationToken())); ArgumentNullTest("source", () => IQueryableExtensions.SingleAsync(null, s => true)); ArgumentNullTest("source", () => IQueryableExtensions.SingleAsync(null, s => true, new CancellationToken())); ArgumentNullTest("predicate", () => Source().SingleAsync(null)); ArgumentNullTest("predicate", () => Source().SingleAsync(null, new CancellationToken())); ArgumentNullTest("source", () => IQueryableExtensions.SingleOrDefaultAsync(null)); ArgumentNullTest("source", () => IQueryableExtensions.SingleOrDefaultAsync(null, new CancellationToken())); ArgumentNullTest("source", () => IQueryableExtensions.SingleOrDefaultAsync(null, s => true)); ArgumentNullTest("source", () => IQueryableExtensions.SingleOrDefaultAsync(null, s => true, new CancellationToken())); ArgumentNullTest("predicate", () => Source().SingleOrDefaultAsync(null)); ArgumentNullTest("predicate", () => Source().SingleOrDefaultAsync(null, new CancellationToken())); ArgumentNullTest("source", () => IQueryableExtensions.ContainsAsync(null, 1)); ArgumentNullTest("source", () => IQueryableExtensions.ContainsAsync(null, 1, new CancellationToken())); ArgumentNullTest("source", () => IQueryableExtensions.AnyAsync(null)); ArgumentNullTest("source", () => IQueryableExtensions.AnyAsync(null, new CancellationToken())); ArgumentNullTest("source", () => IQueryableExtensions.AnyAsync(null, s => true)); ArgumentNullTest("source", () => IQueryableExtensions.AnyAsync(null, s => true, new CancellationToken())); ArgumentNullTest("predicate", () => Source().AnyAsync(null)); ArgumentNullTest("predicate", () => Source().AnyAsync(null, new CancellationToken())); ArgumentNullTest("source", () => IQueryableExtensions.AllAsync(null, s => true)); ArgumentNullTest("source", () => IQueryableExtensions.AllAsync(null, s => true, new CancellationToken())); ArgumentNullTest("predicate", () => Source().AllAsync(null)); ArgumentNullTest("predicate", () => Source().AllAsync(null, new CancellationToken())); ArgumentNullTest("source", () => IQueryableExtensions.CountAsync(null)); ArgumentNullTest("source", () => IQueryableExtensions.CountAsync(null, new CancellationToken())); ArgumentNullTest("source", () => IQueryableExtensions.CountAsync(null, s => true)); ArgumentNullTest("source", () => IQueryableExtensions.CountAsync(null, s => true, new CancellationToken())); ArgumentNullTest("predicate", () => Source().CountAsync(null)); ArgumentNullTest("predicate", () => Source().CountAsync(null, new CancellationToken())); ArgumentNullTest("source", () => IQueryableExtensions.LongCountAsync(null)); ArgumentNullTest("source", () => IQueryableExtensions.LongCountAsync(null, new CancellationToken())); ArgumentNullTest("source", () => IQueryableExtensions.LongCountAsync(null, s => true)); ArgumentNullTest("source", () => IQueryableExtensions.LongCountAsync(null, s => true, new CancellationToken())); ArgumentNullTest("predicate", () => Source().LongCountAsync(null)); ArgumentNullTest("predicate", () => Source().LongCountAsync(null, new CancellationToken())); ArgumentNullTest("source", () => IQueryableExtensions.MinAsync(null)); ArgumentNullTest("source", () => IQueryableExtensions.MinAsync(null, new CancellationToken())); ArgumentNullTest("source", () => IQueryableExtensions.MinAsync(null, s => true)); ArgumentNullTest("source", () => IQueryableExtensions.MinAsync(null, s => true, new CancellationToken())); ArgumentNullTest("selector", () => Source().MinAsync(null)); ArgumentNullTest("selector", () => Source().MinAsync(null, new CancellationToken())); ArgumentNullTest("source", () => IQueryableExtensions.MaxAsync(null)); ArgumentNullTest("source", () => IQueryableExtensions.MaxAsync(null, new CancellationToken())); ArgumentNullTest("source", () => IQueryableExtensions.MaxAsync(null, s => true)); ArgumentNullTest("source", () => IQueryableExtensions.MaxAsync(null, s => true, new CancellationToken())); ArgumentNullTest("selector", () => Source().MaxAsync(null)); ArgumentNullTest("selector", () => Source().MaxAsync(null, new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync()); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync()); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync()); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync()); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync()); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync()); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync()); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync()); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync()); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync()); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(i => 0)); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(i => 0, new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(i => 0)); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(i => 0, new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(i => 0)); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(i => 0, new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(i => 0)); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(i => 0, new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(i => 0)); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(i => 0, new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(i => 0)); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(i => 0, new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(i => 0)); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(i => 0, new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(i => 0)); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(i => 0, new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(i => 0)); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(i => 0, new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(i => 0)); ArgumentNullTest("source", () => ((IQueryable)null).SumAsync(i => 0, new CancellationToken())); ArgumentNullTest("selector", () => Source().SumAsync((Expression>)null)); ArgumentNullTest("selector", () => Source().SumAsync((Expression>)null, new CancellationToken())); ArgumentNullTest("selector", () => Source().SumAsync((Expression>)null)); ArgumentNullTest("selector", () => Source().SumAsync((Expression>)null, new CancellationToken())); ArgumentNullTest("selector", () => Source().SumAsync((Expression>)null)); ArgumentNullTest("selector", () => Source().SumAsync((Expression>)null, new CancellationToken())); ArgumentNullTest("selector", () => Source().SumAsync((Expression>)null)); ArgumentNullTest("selector", () => Source().SumAsync((Expression>)null, new CancellationToken())); ArgumentNullTest("selector", () => Source().SumAsync((Expression>)null)); ArgumentNullTest("selector", () => Source().SumAsync((Expression>)null, new CancellationToken())); ArgumentNullTest("selector", () => Source().SumAsync((Expression>)null)); ArgumentNullTest("selector", () => Source().SumAsync((Expression>)null, new CancellationToken())); ArgumentNullTest("selector", () => Source().SumAsync((Expression>)null)); ArgumentNullTest("selector", () => Source().SumAsync((Expression>)null, new CancellationToken())); ArgumentNullTest("selector", () => Source().SumAsync((Expression>)null)); ArgumentNullTest("selector", () => Source().SumAsync((Expression>)null, new CancellationToken())); ArgumentNullTest("selector", () => Source().SumAsync((Expression>)null)); ArgumentNullTest("selector", () => Source().SumAsync((Expression>)null, new CancellationToken())); ArgumentNullTest("selector", () => Source().SumAsync((Expression>)null)); ArgumentNullTest("selector", () => Source().SumAsync((Expression>)null, new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync()); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync()); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync()); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync()); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync()); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync()); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync()); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync()); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync()); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync()); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(i => 0)); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(i => 0, new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(i => 0)); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(i => 0, new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(i => 0)); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(i => 0, new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(i => 0)); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(i => 0, new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(i => 0)); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(i => 0, new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(i => 0)); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(i => 0, new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(i => 0)); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(i => 0, new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(i => 0)); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(i => 0, new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(i => 0)); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(i => 0, new CancellationToken())); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(i => 0)); ArgumentNullTest("source", () => ((IQueryable)null).AverageAsync(i => 0, new CancellationToken())); ArgumentNullTest("selector", () => Source().AverageAsync((Expression>)null)); ArgumentNullTest("selector", () => Source().AverageAsync((Expression>)null, new CancellationToken())); ArgumentNullTest("selector", () => Source().AverageAsync((Expression>)null)); ArgumentNullTest("selector", () => Source().AverageAsync((Expression>)null, new CancellationToken())); ArgumentNullTest("selector", () => Source().AverageAsync((Expression>)null)); ArgumentNullTest("selector", () => Source().AverageAsync((Expression>)null, new CancellationToken())); ArgumentNullTest("selector", () => Source().AverageAsync((Expression>)null)); ArgumentNullTest("selector", () => Source().AverageAsync((Expression>)null, new CancellationToken())); ArgumentNullTest("selector", () => Source().AverageAsync((Expression>)null)); ArgumentNullTest("selector", () => Source().AverageAsync((Expression>)null, new CancellationToken())); ArgumentNullTest("selector", () => Source().AverageAsync((Expression>)null)); ArgumentNullTest("selector", () => Source().AverageAsync((Expression>)null, new CancellationToken())); ArgumentNullTest("selector", () => Source().AverageAsync((Expression>)null)); ArgumentNullTest("selector", () => Source().AverageAsync((Expression>)null, new CancellationToken())); ArgumentNullTest("selector", () => Source().AverageAsync((Expression>)null)); ArgumentNullTest( "selector", () => Source().AverageAsync((Expression>)null, new CancellationToken())); ArgumentNullTest("selector", () => Source().AverageAsync((Expression>)null)); ArgumentNullTest( "selector", () => Source().AverageAsync((Expression>)null, new CancellationToken())); ArgumentNullTest("selector", () => Source().AverageAsync((Expression>)null)); ArgumentNullTest( "selector", () => Source().AverageAsync((Expression>)null, new CancellationToken())); } [Fact] public void Extension_methods_throw_on_non_async_source() { SourceNonAsyncQueryableTest(() => Source().AllAsync(e => true)); SourceNonAsyncQueryableTest(() => Source().AllAsync(e => true, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AnyAsync()); SourceNonAsyncQueryableTest(() => Source().AnyAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AnyAsync(e => true)); SourceNonAsyncQueryableTest(() => Source().AnyAsync(e => true, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AverageAsync()); SourceNonAsyncQueryableTest(() => Source().AverageAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AverageAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().AverageAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AverageAsync()); SourceNonAsyncQueryableTest(() => Source().AverageAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AverageAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().AverageAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AverageAsync()); SourceNonAsyncQueryableTest(() => Source().AverageAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AverageAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().AverageAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AverageAsync()); SourceNonAsyncQueryableTest(() => Source().AverageAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AverageAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().AverageAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AverageAsync()); SourceNonAsyncQueryableTest(() => Source().AverageAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AverageAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().AverageAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AverageAsync()); SourceNonAsyncQueryableTest(() => Source().AverageAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AverageAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().AverageAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AverageAsync()); SourceNonAsyncQueryableTest(() => Source().AverageAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AverageAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().AverageAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AverageAsync()); SourceNonAsyncQueryableTest(() => Source().AverageAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AverageAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().AverageAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AverageAsync()); SourceNonAsyncQueryableTest(() => Source().AverageAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AverageAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().AverageAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AverageAsync()); SourceNonAsyncQueryableTest(() => Source().AverageAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().AverageAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().AverageAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().ContainsAsync(0)); SourceNonAsyncQueryableTest(() => Source().ContainsAsync(0, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().CountAsync()); SourceNonAsyncQueryableTest(() => Source().CountAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().CountAsync(e => true)); SourceNonAsyncQueryableTest(() => Source().CountAsync(e => true, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().FirstAsync()); SourceNonAsyncQueryableTest(() => Source().FirstAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().FirstAsync(e => true)); SourceNonAsyncQueryableTest(() => Source().FirstAsync(e => true, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().FirstOrDefaultAsync()); SourceNonAsyncQueryableTest(() => Source().FirstOrDefaultAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().FirstOrDefaultAsync(e => true)); SourceNonAsyncQueryableTest(() => Source().FirstOrDefaultAsync(e => true, new CancellationToken())); SourceNonAsyncEnumerableTest(() => Source().ForEachAsync(e => e.GetType())); SourceNonAsyncEnumerableTest(() => Source().ForEachAsync(e => e.GetType(), new CancellationToken())); SourceNonAsyncEnumerableTest(() => Source().LoadAsync()); SourceNonAsyncEnumerableTest(() => Source().LoadAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().LongCountAsync()); SourceNonAsyncQueryableTest(() => Source().LongCountAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().LongCountAsync(e => true)); SourceNonAsyncQueryableTest(() => Source().LongCountAsync(e => true, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().MaxAsync()); SourceNonAsyncQueryableTest(() => Source().MaxAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().MaxAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().MaxAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().MinAsync()); SourceNonAsyncQueryableTest(() => Source().MinAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().MinAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().MinAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SingleAsync()); SourceNonAsyncQueryableTest(() => Source().SingleAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SingleAsync(e => true)); SourceNonAsyncQueryableTest(() => Source().SingleAsync(e => true, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SingleOrDefaultAsync()); SourceNonAsyncQueryableTest(() => Source().SingleOrDefaultAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SingleOrDefaultAsync(e => true)); SourceNonAsyncQueryableTest(() => Source().SingleOrDefaultAsync(e => true, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SumAsync()); SourceNonAsyncQueryableTest(() => Source().SumAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SumAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().SumAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SumAsync()); SourceNonAsyncQueryableTest(() => Source().SumAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SumAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().SumAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SumAsync()); SourceNonAsyncQueryableTest(() => Source().SumAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SumAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().SumAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SumAsync()); SourceNonAsyncQueryableTest(() => Source().SumAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SumAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().SumAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SumAsync()); SourceNonAsyncQueryableTest(() => Source().SumAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SumAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().SumAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SumAsync()); SourceNonAsyncQueryableTest(() => Source().SumAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SumAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().SumAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SumAsync()); SourceNonAsyncQueryableTest(() => Source().SumAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SumAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().SumAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SumAsync()); SourceNonAsyncQueryableTest(() => Source().SumAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SumAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().SumAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SumAsync()); SourceNonAsyncQueryableTest(() => Source().SumAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SumAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().SumAsync(e => e, new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SumAsync()); SourceNonAsyncQueryableTest(() => Source().SumAsync(new CancellationToken())); SourceNonAsyncQueryableTest(() => Source().SumAsync(e => e)); SourceNonAsyncQueryableTest(() => Source().SumAsync(e => e, new CancellationToken())); SourceNonAsyncEnumerableTest(() => Source().ToArrayAsync()); SourceNonAsyncEnumerableTest(() => Source().ToArrayAsync(new CancellationToken())); SourceNonAsyncEnumerableTest(() => Source().ToDictionaryAsync(e => e)); SourceNonAsyncEnumerableTest(() => Source().ToDictionaryAsync(e => e, new CancellationToken())); SourceNonAsyncEnumerableTest(() => Source().ToDictionaryAsync(e => e, e => e)); SourceNonAsyncEnumerableTest(() => Source().ToDictionaryAsync(e => e, e => e, new CancellationToken())); SourceNonAsyncEnumerableTest( () => Source().ToDictionaryAsync( e => e, new Mock>().Object)); SourceNonAsyncEnumerableTest( () => Source().ToDictionaryAsync( e => e, new Mock>().Object, new CancellationToken())); SourceNonAsyncEnumerableTest( () => Source().ToDictionaryAsync( e => e, e => e, new Mock>().Object)); SourceNonAsyncEnumerableTest( () => Source().ToDictionaryAsync( e => e, e => e, new Mock>().Object, new CancellationToken())); SourceNonAsyncEnumerableTest(() => Source().ToListAsync()); SourceNonAsyncEnumerableTest(() => Source().ToListAsync(new CancellationToken())); SourceNonAsyncEnumerableTest(() => ((IQueryable)Source()).ForEachAsync(e => e.GetType())); SourceNonAsyncEnumerableTest(() => ((IQueryable)Source()).ForEachAsync(e => e.GetType(), new CancellationToken())); SourceNonAsyncEnumerableTest(() => (Source()).ToListAsync()); SourceNonAsyncEnumerableTest(() => (Source()).ToListAsync(new CancellationToken())); } [Fact] public void Extension_methods_call_provider_ExecuteAsync() { var cancellationTokenSource = new CancellationTokenSource(); VerifyProducedExpression(value => value.AllAsync(e => true)); VerifyProducedExpression(value => value.AllAsync(e => true, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AnyAsync()); VerifyProducedExpression(value => value.AnyAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AnyAsync(e => true)); VerifyProducedExpression(value => value.AnyAsync(e => true, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AverageAsync()); VerifyProducedExpression(value => value.AverageAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AverageAsync(e => e)); VerifyProducedExpression(value => value.AverageAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AverageAsync()); VerifyProducedExpression(value => value.AverageAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AverageAsync(e => e)); VerifyProducedExpression(value => value.AverageAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AverageAsync()); VerifyProducedExpression(value => value.AverageAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AverageAsync(e => e)); VerifyProducedExpression(value => value.AverageAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AverageAsync()); VerifyProducedExpression(value => value.AverageAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AverageAsync(e => e)); VerifyProducedExpression(value => value.AverageAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AverageAsync()); VerifyProducedExpression(value => value.AverageAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AverageAsync(e => e)); VerifyProducedExpression(value => value.AverageAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AverageAsync()); VerifyProducedExpression(value => value.AverageAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AverageAsync(e => e)); VerifyProducedExpression(value => value.AverageAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AverageAsync()); VerifyProducedExpression(value => value.AverageAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AverageAsync(e => e)); VerifyProducedExpression(value => value.AverageAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AverageAsync()); VerifyProducedExpression(value => value.AverageAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AverageAsync(e => e)); VerifyProducedExpression(value => value.AverageAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AverageAsync()); VerifyProducedExpression(value => value.AverageAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AverageAsync(e => e)); VerifyProducedExpression(value => value.AverageAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AverageAsync()); VerifyProducedExpression(value => value.AverageAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.AverageAsync(e => e)); VerifyProducedExpression(value => value.AverageAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.ContainsAsync(0)); VerifyProducedExpression(value => value.ContainsAsync(0, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.CountAsync()); VerifyProducedExpression(value => value.CountAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.CountAsync(e => true)); VerifyProducedExpression(value => value.CountAsync(e => true, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.FirstAsync()); VerifyProducedExpression(value => value.FirstAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.FirstAsync(e => true)); VerifyProducedExpression(value => value.FirstAsync(e => true, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.FirstOrDefaultAsync()); VerifyProducedExpression(value => value.FirstOrDefaultAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.FirstOrDefaultAsync(e => true)); VerifyProducedExpression(value => value.FirstOrDefaultAsync(e => true, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.LongCountAsync()); VerifyProducedExpression(value => value.LongCountAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.LongCountAsync(e => true)); VerifyProducedExpression(value => value.LongCountAsync(e => true, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.MaxAsync()); VerifyProducedExpression(value => value.MaxAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.MaxAsync(e => e)); VerifyProducedExpression(value => value.MaxAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.MinAsync()); VerifyProducedExpression(value => value.MinAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.MinAsync(e => e)); VerifyProducedExpression(value => value.MinAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SingleAsync()); VerifyProducedExpression(value => value.SingleAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SingleAsync(e => true)); VerifyProducedExpression(value => value.SingleAsync(e => true, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SingleOrDefaultAsync()); VerifyProducedExpression(value => value.SingleOrDefaultAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SingleOrDefaultAsync(e => true)); VerifyProducedExpression(value => value.SingleOrDefaultAsync(e => true, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SumAsync()); VerifyProducedExpression(value => value.SumAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SumAsync(e => e)); VerifyProducedExpression(value => value.SumAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SumAsync()); VerifyProducedExpression(value => value.SumAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SumAsync(e => e)); VerifyProducedExpression(value => value.SumAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SumAsync()); VerifyProducedExpression(value => value.SumAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SumAsync(e => e)); VerifyProducedExpression(value => value.SumAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SumAsync()); VerifyProducedExpression(value => value.SumAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SumAsync(e => e)); VerifyProducedExpression(value => value.SumAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SumAsync()); VerifyProducedExpression(value => value.SumAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SumAsync(e => e)); VerifyProducedExpression(value => value.SumAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SumAsync()); VerifyProducedExpression(value => value.SumAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SumAsync(e => e)); VerifyProducedExpression(value => value.SumAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SumAsync()); VerifyProducedExpression(value => value.SumAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SumAsync(e => e)); VerifyProducedExpression(value => value.SumAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SumAsync()); VerifyProducedExpression(value => value.SumAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SumAsync(e => e)); VerifyProducedExpression(value => value.SumAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SumAsync()); VerifyProducedExpression(value => value.SumAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SumAsync(e => e)); VerifyProducedExpression(value => value.SumAsync(e => e, cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SumAsync()); VerifyProducedExpression(value => value.SumAsync(cancellationTokenSource.Token)); VerifyProducedExpression(value => value.SumAsync(e => e)); VerifyProducedExpression(value => value.SumAsync(e => e, cancellationTokenSource.Token)); } private static IQueryable Source() { return new Mock>().Object; } private static IQueryable Source() { return Source(); } private static void ArgumentNullTest(string paramName, Action test) { Assert.Equal(paramName, Assert.Throws(() => test()).ParamName); } private static void SourceNonAsyncQueryableTest(Action test) { Assert.Equal(Strings.IQueryable_Provider_Not_Async, Assert.Throws(() => test()).Message); } private static void SourceNonAsyncEnumerableTest(Action test) { Assert.Equal(Strings.IQueryable_Not_Async(string.Empty), Assert.Throws(() => test()).Message); } private static void SourceNonAsyncEnumerableTest(Action test) { Assert.Equal( Strings.IQueryable_Not_Async("<" + typeof(T) + ">"), Assert.Throws(() => test()).Message); } private static void VerifyProducedExpression( Expression, Task>> testExpression) { var queryableMock = new Mock>(); var providerMock = new Mock(); providerMock.Setup(m => m.ExecuteAsync(It.IsAny(), It.IsAny())) .Returns( (e, ct) => { var expectedMethodCall = (MethodCallExpression)testExpression.Body; var actualMethodCall = (MethodCallExpression)e; Assert.Equal( expectedMethodCall.Method.Name, actualMethodCall.Method.Name + "Async"); var lastArgument = expectedMethodCall.Arguments[expectedMethodCall.Arguments.Count - 1] as MemberExpression; var cancellationTokenPresent = lastArgument != null && lastArgument.Type == typeof(CancellationToken); if (cancellationTokenPresent) { Assert.NotEqual(ct, CancellationToken.None); } else { Assert.Equal(ct, CancellationToken.None); } var expectedNumberOfArguments = cancellationTokenPresent ? expectedMethodCall.Arguments.Count - 1 : expectedMethodCall.Arguments.Count; Assert.Equal(expectedNumberOfArguments, actualMethodCall.Arguments.Count); for (var i = 1; i < expectedNumberOfArguments; i++) { var expectedArgument = expectedMethodCall.Arguments[i]; var actualArgument = actualMethodCall.Arguments[i]; Assert.Equal(expectedArgument.ToString(), actualArgument.ToString()); } return Task.FromResult(default(TResult)); }); queryableMock.Setup(m => m.Provider).Returns(providerMock.Object); queryableMock.Setup(m => m.Expression).Returns(Expression.Constant(queryableMock.Object, typeof(IQueryable))); testExpression.Compile()(queryableMock.Object); } #endif #endregion } }