#define BOOST_TEST_MODULE ScopeExit
#include <boost/test/unit_test.hpp>

#include "scopeExit.h"
#include <stdexcept>
#include <string>

using namespace AdHoc;

BOOST_AUTO_TEST_CASE(cleanexit)
{
	std::string log;
	{
		ScopeExit se(
				[&log] {
					log += "before";
				},
				[&log] {
					log += "clean";
				},
				[&log] {
					log += "error";
				},
				[&log] {
					log += "after";
				});
	}
	BOOST_REQUIRE_EQUAL(log, "beforecleanafter");
}

BOOST_AUTO_TEST_CASE(uncaught)
{
	BOOST_REQUIRE_THROW(
			{
				std::string log;
				{
					ScopeExit se(
							[&log] {
								log += "before";
							},
							[&log] {
								log += "clean";
							},
							[&log] {
								log += "error";
							},
							[&log] {
								log += "after";
							});
					throw std::runtime_error("test unclean exit");
				}
				BOOST_REQUIRE_EQUAL(log, "beforeerrorafter");
			},
			std::runtime_error);
}