Newer
Older
minerva / Tests / AK / TestGeneratorAK.cpp
@minerva minerva on 13 Jul 1 KB Initial commit
/*
 * Copyright (c) 2024, Dan Klishch <danilklishch@gmail.com>
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#include <AK/Generator.h>
#include <LibTest/AsyncTestCase.h>

namespace {

Generator<int, Empty> generate_sync(Vector<int>& order)
{
    ScopeGuard guard = [&] {
        order.append(7);
    };

    order.append(2);
    co_yield 1;
    order.append(4);
    co_yield 2;
    order.append(6);
    co_return {};
}

}

ASYNC_TEST_CASE(sync_order)
{
    Vector<int> order;

    auto gen = generate_sync(order);
    EXPECT(!gen.is_done());

    order.append(1);

    auto result1 = gen.next();
    order.append(3);
    EXPECT(result1.await_ready());
    EXPECT_EQ(result1.await_resume(), 1);

    auto result2 = gen.next();
    order.append(5);
    EXPECT(result2.await_ready());
    EXPECT_EQ(result2.await_resume(), 2);

    auto end = gen.next();
    order.append(8);
    EXPECT(end.await_ready());
    EXPECT_EQ(end.await_resume(), Empty {});

    EXPECT_EQ(order, (Vector<int> { 1, 2, 3, 4, 5, 6, 7, 8 }));
    co_return;
}