public void ExecuteAsync() { foreach (var item in TestCases()) { var filter = new DerivedSequenceFilter(item.shortCircuiting); var source = new DummySource[] { new DummySource(), new DummySource(), }; var context = new DummyContext(); var invokedNext = false; SequenceFilterFunc <DummySource> next = _ => { invokedNext = true; return(Task.FromResult(_)); }; new TestCaseRunner($"No.{item.testNumber}") .Run(() => filter.ExecuteAsync(source, context, next)) .Verify((actual, desc) => { Assert.AreEqual(source, actual, $"{desc}: 入力シーケンスが出力に素通しされていません。"); Assert.AreEqual(context, filter.ActualContext, $"{desc}: フィルター時のコンテキストが同一インスタンスではありません。"); Assert.AreEqual(item.shortCircuiting, !invokedNext, $"{desc}: ショートサーキットの有無が期待値と一致しません。"); }, (Type)null); } (int testNumber, bool shortCircuiting)[] TestCases() => new[] {
/// <summary> /// <see cref="IPipelineBuilder{T, TContext}.Build"/> の実装。 /// </summary> public SequenceFilterFunc <T, TContext> Build() { SequenceFilterFunc <T, TContext> filter = (src, _) => Task.FromResult(src); foreach (var filterFactory in _filterFactories.Reverse()) { filter = filterFactory(filter); Debug.Assert(filter != null); } return(filter); }
public Task <IEnumerable <DummySource> > ExecuteAsync(IEnumerable <DummySource> source, DummyContext context, SequenceFilterFunc <DummySource> next) { _logging(); return(next(source)); }
public Task <IEnumerable <DummySource> > ExecuteAsync(IEnumerable <DummySource> source, DummyContext context, SequenceFilterFunc <DummySource> next) { Invoked = true; ActualContext = context; return(next(source)); }
/// <summary> /// <see cref="ISequenceFilter{T, TContext}.ExecuteAsync(IEnumerable{T}, TContext, SequenceFilterFunc{T})"/> の実装。 /// 既定の実装では <see cref="Execute(IEnumerable{T}, TContext, ref bool)"/> に処理を委譲します。 /// </summary> public virtual Task <IEnumerable <T> > ExecuteAsync(IEnumerable <T> source, TContext context, SequenceFilterFunc <T> next) { Debug.Assert(source != null); Debug.Assert(context != null); Debug.Assert(next != null); var cancelled = false; var result = Execute(source, context, ref cancelled); if (cancelled) { return(Task.FromResult(result)); } return(next(result)); }
/// <summary> /// <see cref="QueryServer{TRequest, TSource}"/> クラスの新しいインスタンスを初期化します。 /// </summary> /// <param name="repository"><typeparamref name="TSource"/> のコレクションを返すリポジトリ。</param> /// <param name="filter">リポジトリが返す <typeparamref name="TSource"/> のコレクションに対して適用されるフィルター。</param> /// <exception cref="ArgumentNullException"><paramref name="repository"/> or <paramref name="filter"/> is <c>null</c>.</exception> public QueryServer(IQueryRepository <TRequest, TSource> repository, SequenceFilterFunc <TSource, TRequest> filter) { _repository = repository ?? throw new ArgumentNullException(nameof(repository)); _filter = filter ?? throw new ArgumentNullException(nameof(filter)); }