/**
 * @file cached_value_tests.cpp
 * tests cached_value.h
 *
 * @remark Copyright 2005 OProfile authors
 * @remark Read the file COPYING
 *
 * @author John Levon
 */

#include <cstdlib>
#include <iostream>
#include <string>

#include "cached_value.h"

using namespace std;

namespace {


bool check_throw(cached_value<bool> const & boolval)
{
	try {
		bool foo = boolval.get();
		foo = false;
	} catch (op_fatal_error const & e) {
		return true;
	}
	return false;
}


int check_cached(void)
{
	cached_value<bool> boolval;
	cached_value<string> strval;

	if (!check_throw(boolval)) {
		cerr << "get() on no value didn't throw\n";
		return EXIT_FAILURE;
	}

	if (boolval.reset(false) != false || boolval.get() != false) {
		cerr << "reset() of cached value \"false\" didn't work\n";
		return EXIT_FAILURE;
	}

	if (boolval.reset(true) != true || boolval.get() != true) {
		cerr << "reset() of cached value \"true\" didn't work\n";
		return EXIT_FAILURE;
	}

	if (strval.reset("foo") != "foo" || strval.get() != "foo") {
		cerr << "reset() of cached value \"foo\" didn't work\n";
		return EXIT_FAILURE;
	}

	if (strval.reset("") != "" || strval.get() != "") {
		cerr << "reset() of cached value \"\" didn't work\n";
		return EXIT_FAILURE;
	}

	return EXIT_SUCCESS;
}

};

int main()
{
	try {
		check_cached();
	}
	catch (...) {
		cerr << "unknown exception\n";
		return EXIT_FAILURE;
	}

	return EXIT_SUCCESS;
}