// Description: Testing for optional objects
// DocumentationOf: optional.h
#include "test/test_init.h"
#include "pastel/sys/optional/optional.h"
namespace
{
    class B
    {
    public:
        B()
            : b(0)
        {
        }
        explicit B(int b_)
            : b(b_)
        {
        }
        int b;
    };
    void f(integer x)
    {
    }
    void g(Optional<integer> x)
    {
    }
}
TEST_CASE("Optional (Optional)")
{
    Optional<integer> a;
    REQUIRE(a.empty());
    // The zero is treated as a non-empty
    // optional: therefore it should not
    // match.
    REQUIRE(a != 0);
    REQUIRE(a != 0.0);
    a = 2;
    REQUIRE(!a.empty());
    REQUIRE(a == 2);
    REQUIRE(a == 2.0);
    a.clear();
    REQUIRE(a.empty());
    Optional<B> b;
    REQUIRE(b.empty());
    REQUIRE(b.b == 0);
    b.b = 3;
    REQUIRE(b.empty());
    REQUIRE(b.b == 3);
    b = B(2);
    REQUIRE(!b.empty());
    REQUIRE(b.b == 2);
    // Optional<Type> is implicitly convertible 
    // to type.
    f(a);
    // Type is implicitly convertible to Optional<Type>.
    g(3);
}