TEST(ResourceManager,remove)
{
    ResourceManager<TestResource> manager;
    auto handle0 = manager.add(0, "0");
    auto handle1 = manager.add(1, "1");
    auto handle2 = manager.add(2, "2");
    auto handle3 = manager.add(3, "3");
    auto handle1Copy = handle1;
    auto pRes1 = manager.request(handle1, true);
    ASSERT_NEQ(pRes1, nullptr);
    ASSERT_EQ(pRes1->m_int, 1);
    ASSERT_EQ(pRes1->m_string, "1");
    ASSERT(pRes1->isLoaded());
    bool removed = manager.remove(handle1, false);
    ASSERT(removed == false);
    handle1Copy = TestResource::ResourceHandle{};
    removed = manager.remove(handle1, false);
    ASSERT(removed == true);
    auto handle5 = manager.add(5, "5");
    auto handle5Copy = handle5;
    auto handle5Ident = manager.identify(5, "5");
    ASSERT_EQ(handle5, handle5Ident);
    removed = manager.remove(handle5, false);
    ASSERT(removed == false);
    removed = manager.remove(handle5, true);
    ASSERT(removed == true);
}
TEST(ResourceManager,identify)
{
    ResourceManager<TestResource> manager;
    manager.add(0, "");
    manager.add(42, "");
    auto handle1 = manager.add(42, std::string("Hello World"));
    ASSERT(handle1.isValid());
    manager.add(1, "Hello World");
    auto handle1_o = manager.identify("Hello World");
    ASSERT(handle1_o.isValid());
    ASSERT_EQ(handle1_o, handle1);
    auto handle1_o2 = manager.identify(42, "Hello World");
    ASSERT(handle1_o2.isValid());
    ASSERT_EQ(handle1_o2, handle1);
    auto handle1_o22 = manager.identify(42, "Hello World");
    ASSERT(handle1_o22.isValid());
    ASSERT_EQ(handle1_o22, handle1);
    auto handle1_o23 = manager.identify(&noop);
    ASSERT(handle1_o23.isValid());
    auto handle1_o24 = manager.identify(&noop);
    ASSERT_EQ(handle1_o23, handle1_o24);
    auto handle2 = manager.identify(&TestResource::noop);
    ASSERT(handle2.isValid());

    auto handle2_o = manager.identify("Hello");
    ASSERT(!handle2_o.isValid());
    ASSERT_NEQ(handle2_o, handle1);
}
TEST(ResourceManager,loadNext)
{
    ResourceManager<TestResource> manager;
    {
	auto handle0 = manager.add(0, "0");
	auto handle1 = manager.add(1, "1");
	auto handle2 = manager.add(2, "2");
	auto handle3 = manager.add(3, "3");
	auto pRes1 = manager.request(handle1, false);
	auto pRes2 = manager.request(handle2, false);
	while (manager.needLoad())
	    manager.loadNext();
	ASSERT_EQ(pRes1->isLoaded(), true);
	ASSERT_EQ(pRes2->isLoaded(), true);
	ASSERT_NOTHROW(manager.loadNext());
    }
    // Let it unload the resources
    for(unsigned int i = 0; i < manager.size(); i++)
	manager.loadNext();
    ASSERT_EQ(manager.request(manager.identify(1, "1"), false)->isLoaded(), false);
    ASSERT_EQ(manager.request(manager.identify(2, "2"), false)->isLoaded(), false);
}