def test_resource_manager_generated_flow_structure(api):
    manager = resource_manager(MyResource)

    if api == "functional":
        with Flow("test") as flow:
            a = inc(1)
            context = manager(a)
            with context as resource:
                b = add(resource, a)
                c = inc(b)
                d = inc(2)
                e = inc(d)
                f = inc(3)
            g = inc(f)
    else:
        flow = Flow("test")
        a = inc(1, flow=flow)
        context = manager(a, flow=flow)
        with context as resource:
            b = add(resource, a, flow=flow)
            c = inc(b, flow=flow)
            d = inc(2, flow=flow)
            e = inc(d, flow=flow)
            f = inc(3, flow=flow)
        g = inc(f, flow=flow)

    # task kwargs successfully forwarded to tasks
    assert context.init_task.name == "MyResource"
    assert context.setup_task.name == "MyResource.setup"
    assert context.cleanup_task.name == "MyResource.cleanup"
    assert not context.cleanup_task.skip_on_upstream_skip

    # Reference tasks setup properly
    assert flow.reference_tasks() == {c, e, g}

    # Check that:
    # - Tasks with no upstream dependency in the resource context have
    #   the setup task set as an upstream dependency
    # - Tasks with no downstream dependency in the resource context have
    #   the cleanup task set as a downstream dependency
    # - All other tasks only have explicit dependencies
    assert flow.upstream_tasks(a) == set()
    assert flow.upstream_tasks(context.init_task) == {a}
    assert flow.upstream_tasks(context.setup_task) == {context.init_task}
    assert flow.upstream_tasks(b) == {context.setup_task, a}
    assert flow.upstream_tasks(c) == {b}
    assert flow.upstream_tasks(d) == {context.setup_task}
    assert flow.upstream_tasks(e) == {d}
    assert flow.upstream_tasks(f) == {context.setup_task}
    assert flow.upstream_tasks(g) == {f}
    assert flow.upstream_tasks(context.cleanup_task) == {
        context.init_task,
        context.setup_task,
        c,
        e,
        f,
    }