/*
 *  Created by Phil on 29/11/2010.
 *  Copyright 2010 Two Blue Cubes Ltd. All rights reserved.
 *
 *  Distributed under the Boost Software License, Version 1.0. (See accompanying
 *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 */

#include "catch.hpp"

inline bool itDoesThis(){ return true; }
inline bool itDoesThat(){ return true; }

SCENARIO( "Do that thing with the thing", "[Tags]" ) {
    GIVEN( "This stuff exists" ) {
        // make stuff exist
        WHEN( "I do this" ) {
            // do this
            THEN( "it should do this")
            {
                REQUIRE( itDoesThis() );
                AND_THEN( "do that")
                    REQUIRE( itDoesThat() );
            }
        }
    }
}

SCENARIO( "Vector resizing affects size and capacity", "[vector][bdd][size][capacity]" ) {
    GIVEN( "an empty vector" ) {
        std::vector<int> v;
        REQUIRE( v.size() == 0 );

        WHEN( "it is made larger" ) {
            v.resize( 10 );
            THEN( "the size and capacity go up" ) {
                REQUIRE( v.size() == 10 );
                REQUIRE( v.capacity() >= 10 );

                AND_WHEN( "it is made smaller again" ) {
                    v.resize( 5 );
                    THEN( "the size goes down but the capacity stays the same" ) {
                        REQUIRE( v.size() == 5 );
                        REQUIRE( v.capacity() >= 10 );
                    }
                }
            }
        }

        WHEN( "we reserve more space" ) {
            v.reserve( 10 );
            THEN( "The capacity is increased but the size remains the same" ) {
                REQUIRE( v.capacity() >= 10 );
                REQUIRE( v.size() == 0 );
            }
        }
    }
}

SCENARIO(   "This is a really long scenario name to see how the list command deals with wrapping",
            "[very long tags][lots][long][tags][verbose]"
            "[one very long tag name that should cause line wrapping writing out using the list command]"
            "[anotherReallyLongTagNameButThisOneHasNoObviousWrapPointsSoShouldSplitWithinAWordUsingADashCharacter]" ) {
    GIVEN( "A section name that is so long that it cannot fit in a single console width" )
        WHEN( "The test headers are printed as part of the normal running of the scenario" )
            THEN( "The, deliberately very long and overly verbose (you see what I did there?) section names must wrap, along with an indent" )
                SUCCEED("boo!");
}

namespace {

// a trivial fixture example to support SCENARIO_METHOD tests
struct Fixture
{
    Fixture()
    : d_counter(0)
    {
    }

    int counter()
    {
        return d_counter++;
    }

    int d_counter;
};

}

SCENARIO_METHOD(Fixture,
    "BDD tests requiring Fixtures to provide commonly-accessed data or methods",
    "[bdd][fixtures]") {
    const int before(counter());
    GIVEN("No operations precede me") {
        REQUIRE(before == 0);
        WHEN("We get the count") {
            const int after(counter());
            THEN("Subsequently values are higher") {
                REQUIRE(after > before);
            }
        }
    }
}
