Example #1
0
        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[] {
Example #2
0
        /// <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);
        }
Example #3
0
 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));
 }
Example #5
0
        /// <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));
        }
Example #6
0
 /// <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));
 }