114299Sbbruce@ucdavis.edu/*
214299Sbbruce@ucdavis.edu    tests/test_async.cpp -- __await__ support
314299Sbbruce@ucdavis.edu
414299Sbbruce@ucdavis.edu    Copyright (c) 2019 Google Inc.
514299Sbbruce@ucdavis.edu
614299Sbbruce@ucdavis.edu    All rights reserved. Use of this source code is governed by a
714299Sbbruce@ucdavis.edu    BSD-style license that can be found in the LICENSE file.
814299Sbbruce@ucdavis.edu*/
914299Sbbruce@ucdavis.edu
1014299Sbbruce@ucdavis.edu#include "pybind11_tests.h"
1114299Sbbruce@ucdavis.edu
1214299Sbbruce@ucdavis.eduTEST_SUBMODULE(async_module, m) {
1314299Sbbruce@ucdavis.edu    struct DoesNotSupportAsync {};
1414299Sbbruce@ucdavis.edu    py::class_<DoesNotSupportAsync>(m, "DoesNotSupportAsync")
1514299Sbbruce@ucdavis.edu        .def(py::init<>());
1614299Sbbruce@ucdavis.edu    struct SupportsAsync {};
1714299Sbbruce@ucdavis.edu    py::class_<SupportsAsync>(m, "SupportsAsync")
1814299Sbbruce@ucdavis.edu        .def(py::init<>())
1914299Sbbruce@ucdavis.edu        .def("__await__", [](const SupportsAsync& self) -> py::object {
2014299Sbbruce@ucdavis.edu            static_cast<void>(self);
2114299Sbbruce@ucdavis.edu            py::object loop = py::module::import("asyncio.events").attr("get_event_loop")();
2214299Sbbruce@ucdavis.edu            py::object f = loop.attr("create_future")();
2314299Sbbruce@ucdavis.edu            f.attr("set_result")(5);
2414299Sbbruce@ucdavis.edu            return f.attr("__await__")();
2514299Sbbruce@ucdavis.edu        });
2614299Sbbruce@ucdavis.edu}
27