/* This file is part of MAUS: http://micewww.pp.rl.ac.uk/projects/maus
*
* MAUS is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MAUS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MAUS. If not, see .
*
*/
#include
#include "gtest/gtest.h"
#include "src/common_cpp/Utils/Exception.hh"
#include "src/common_cpp/Utils/ExceptionLevel.hh"
namespace MAUS {
TEST(ExceptionTest, ConstructorAccessorTest) {
// just check it doesnt do anything daft
Exceptions::Exception* exception = new Exceptions::Exception();
delete exception;
exception = new Exceptions::Exception(Exceptions::recoverable, "error", "location");
EXPECT_EQ(exception->GetErrorLevel(), Exceptions::recoverable);
EXPECT_EQ(exception->GetMessage(), "error");
EXPECT_EQ(exception->GetLocation(), "location");
EXPECT_EQ(std::string(exception->what()), std::string("error at location"));
delete exception;
}
TEST(ExceptionTest, SetGetMessageTest) {
Exceptions::Exception exception(Exceptions::recoverable, "error", "location");
exception.SetMessage("new error");
EXPECT_EQ(exception.GetMessage(), "new error");
EXPECT_EQ(std::string(exception.what()), std::string("new error at location"));
}
std::string test_make_stack_trace(size_t skips, int recursion_level) {
if (recursion_level <= 0) {
return Exceptions::Exception::MakeStackTrace(skips);
} else {
return test_make_stack_trace(skips, recursion_level-1);
}
}
TEST(ExceptionTest, MakeStackTraceTest) {
std::string stack_trace = test_make_stack_trace(2, 4);
// one skip is the MakeStackTrace;
// one skip is a call to _test_make_stack_trace
// should be 3 more occurences of test_make_stack_trace in the stack
int n_occurrences = 0;
size_t pos = stack_trace.find(stack_trace, 0);
while (pos != std::string::npos && n_occurrences < 10) {
++n_occurrences;
pos = stack_trace.find("test_cpp_unit", pos+1);
}
// better to test n_occurrences = some_value
EXPECT_GE(n_occurrences, 0) << stack_trace;
}
TEST(ExceptionTest, PrintTest) {
// just run the code; probably if I was being careful I would check the
// output by redirecting Squeak...
Exceptions::Exception exception(Exceptions::recoverable, "error", "location");
exception.Print();
}
TEST(ExceptionTest, TestWillDoStackTrace) {
Exceptions::Exception::SetWillDoStackTrace(true);
EXPECT_TRUE(Exceptions::Exception::GetWillDoStackTrace());
Exceptions::Exception exception_1(Exceptions::recoverable, "error", "location");
EXPECT_TRUE(exception_1.GetStackTrace() != "");
Exceptions::Exception::SetWillDoStackTrace(false);
EXPECT_FALSE(Exceptions::Exception::GetWillDoStackTrace());
Exceptions::Exception exception_2(Exceptions::recoverable, "error", "location");
EXPECT_TRUE(exception_2.GetStackTrace() == "");
Exceptions::Exception::SetWillDoStackTrace(true);
EXPECT_TRUE(Exceptions::Exception::GetWillDoStackTrace());
Exceptions::Exception exception_3(Exceptions::recoverable, "error", "location");
EXPECT_TRUE(exception_3.GetStackTrace() != "");
}
}