void ConfigurationTest::move() {
    Configuration conf;
    ConfigurationGroup* original = conf.addGroup("group");
    original->addGroup("descendent")->setValue<int>("value", 42);

    /* Move constructor for ConfigurationGroup */
    ConfigurationGroup* constructedMove = new ConfigurationGroup(std::move(*original));
    CORRADE_VERIFY(original->isEmpty());
    CORRADE_VERIFY(!constructedMove->configuration());
    CORRADE_VERIFY(!constructedMove->group("descendent")->configuration());

    /* Move assignment for ConfigurationGroup */
    ConfigurationGroup* assignedMove = conf.addGroup("another");
    CORRADE_VERIFY(assignedMove->configuration() == &conf);
    *assignedMove = std::move(*constructedMove);
    CORRADE_VERIFY(constructedMove->isEmpty());
    CORRADE_VERIFY(assignedMove->configuration() == &conf);
    CORRADE_VERIFY(assignedMove->group("descendent")->configuration() == &conf);

    delete constructedMove;

    /* Move constructor for Configuration */
    Configuration confConstructedMove(std::move(conf));
    CORRADE_VERIFY(conf.isEmpty());
    CORRADE_VERIFY(confConstructedMove.configuration() == &confConstructedMove);
    CORRADE_VERIFY(confConstructedMove.group("group")->configuration() == &confConstructedMove);

    /* Move assignment for Configuration */
    Configuration confAssignedMove;
    confAssignedMove = std::move(confConstructedMove);
    CORRADE_VERIFY(confConstructedMove.isEmpty());
    CORRADE_VERIFY(confAssignedMove.configuration() == &confAssignedMove);
    CORRADE_VERIFY(confAssignedMove.group("group")->configuration() == &confAssignedMove);
}
void ConfigurationTest::standaloneGroup() {
    ConfigurationGroup group;
    CORRADE_VERIFY(!group.configuration());

    group.setValue("value", "hello");
    group.addGroup("group")->addValue("number", 42);

    CORRADE_COMPARE(group.value("value"), "hello");
    CORRADE_COMPARE(group.group("group")->value<int>("number"), 42);
}
void ConfigurationTest::copy() {
    Configuration conf;

    ConfigurationGroup* original = conf.addGroup("group");
    original->addGroup("descendent")->setValue<int>("value", 42);

    ConfigurationGroup* constructedCopy = new ConfigurationGroup(*original);
    CORRADE_VERIFY(!constructedCopy->configuration());
    CORRADE_VERIFY(!constructedCopy->group("descendent")->configuration());

    ConfigurationGroup* assignedCopy = conf.addGroup("another");
    CORRADE_VERIFY(assignedCopy->configuration() == &conf);
    *assignedCopy = *original;
    CORRADE_VERIFY(assignedCopy->configuration() == &conf);
    CORRADE_VERIFY(assignedCopy->group("descendent")->configuration() == &conf);

    original->group("descendent")->setValue<int>("value", 666);

    CORRADE_COMPARE(original->group("descendent")->value<int>("value"), 666);
    CORRADE_COMPARE(constructedCopy->group("descendent")->value<int>("value"), 42);
    CORRADE_COMPARE(assignedCopy->group("descendent")->value<int>("value"), 42);

    delete constructedCopy;
}