public async Task Context_設定したコンテキストが取得できる()
    {
        var accessor = new ServiceLikeContextAccessor();
        var context  = new ServiceLikeContext("foo");

        accessor.Context = context;

        await Task.Delay(100);

        context.Should().BeSameAs(accessor.Context);
    }
    public async Task Context_親のAsyncContextで別のインスタンスが設定されたら子のコンテキストはnullになる()
    {
        var accessor = new ServiceLikeContextAccessor();
        var context  = new ServiceLikeContext("foo");

        accessor.Context = context;

        var checkAsyncFlowTcs = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously);
        var waitForNullTcs    = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously);
        var afterNullCheckTcs = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously);

        ThreadPool.QueueUserWorkItem(async _ =>
        {
            context.Should().BeSameAs(accessor.Context);
            checkAsyncFlowTcs.SetResult(null);

            await waitForNullTcs.Task;

            try
            {
                accessor.Context.Should().BeNull();
                afterNullCheckTcs.SetResult(null);
            }
            catch (Exception ex)
            {
                afterNullCheckTcs.SetException(ex);
            }
        });

        await checkAsyncFlowTcs.Task;

        var context2 = new ServiceLikeContext("bar");

        accessor.Context = context2;

        waitForNullTcs.SetResult(null);

        context2.Should().BeSameAs(accessor.Context);

        await afterNullCheckTcs.Task;
    }
    public async Task Context_親のAsyncContextにつながっていない場合は値は設定されない()
    {
        var accessor = new ServiceLikeContextAccessor();
        var context  = new ServiceLikeContext("foo");

        accessor.Context = context;

        var checkAsyncFlowTcs = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously);

        ThreadPool.UnsafeQueueUserWorkItem(_ =>
        {
            try
            {
                accessor.Context.Should().BeNull();
                checkAsyncFlowTcs.SetResult(null);
            }
            catch (Exception ex)
            {
                checkAsyncFlowTcs.SetException(ex);
            }
        }, null);

        await checkAsyncFlowTcs.Task;
    }
    public void ctor_インスタンスを作成した時点ではコンテキストはnull()
    {
        var accessor = new ServiceLikeContextAccessor();

        accessor.Context.Should().BeNull();
    }