#include <catch.hpp>
#include <internal/facts/resolvers/augeas_resolver.hpp>
#include <facter/facts/collection.hpp>
#include <facter/facts/fact.hpp>
#include <facter/facts/scalar_value.hpp>
#include <facter/facts/map_value.hpp>
#include "../../collection_fixture.hpp"

using namespace std;
using namespace facter::facts;
using namespace facter::facts::resolvers;
using namespace facter::testing;

struct empty_augeas_resolver : augeas_resolver
{
 protected:
    virtual string get_version() override
    {
        return {};
    }
};

struct fixed_augeas_resolver : augeas_resolver
{
 protected:
    virtual string get_version() override
    {
        return "foo";
    }
};

SCENARIO("using the augeas resolver") {
    collection_fixture facts;
    WHEN("no version is returned") {
        facts.add(make_shared<empty_augeas_resolver>());
        THEN("the fact is not present") {
            REQUIRE(facts.size() == 0u);
        }
    }
    WHEN("an augeas version is returned") {
        facts.add(make_shared<fixed_augeas_resolver>());
        THEN("a structured fact is returned") {
            REQUIRE(facts.size() == 2u);
            auto augeas = facts.get<map_value>(fact::augeas);
            REQUIRE(augeas);
            REQUIRE(augeas->size() == 1u);
            auto version = augeas->get<string_value>("version");
            REQUIRE(version);
            REQUIRE(version->value() == "foo");
        }
        THEN("flat facts are added") {
            REQUIRE(facts.size() == 2u);
            auto augeasversion = facts.get<string_value>(fact::augeasversion);
            REQUIRE(augeasversion);
            REQUIRE(augeasversion->value() == "foo");
        }
    }
}