summaryrefslogtreecommitdiff
path: root/examples/cppunittest/MockProtector.h
blob: ace538d32039afc5cd2fb0702a0977d6ae3dd2a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#ifndef MOCKPROTECTOR_H
#define MOCKPROTECTOR_H

#include <stdexcept>
#include <cppunit/Protector.h>


class MockProtectorException : public std::runtime_error
{
public:
  MockProtectorException() 
    : std::runtime_error( "MockProtectorException" )
  {
  }
};


class MockProtector : public CPPUNIT_NS::Protector
{
public:
  MockProtector()
    : m_wasCalled( false )
    , m_wasTrapped( false )
    , m_expectException( false )
    , m_hasExpectation( false )
    , m_shouldPropagateException( false )
  {
  }

  bool protect( const CPPUNIT_NS::Functor &functor,
                const CPPUNIT_NS::ProtectorContext &context )
  {
    try
    {
      m_wasCalled = true;
      return functor();
    }
    catch ( MockProtectorException & )
    {
      m_wasTrapped = true;

      if ( m_shouldPropagateException )
        throw;

      reportError( context, CPPUNIT_NS::Message("MockProtector trap") );
    }

    return false;
  }

  void setExpectException()
  {
    m_expectException = true;
    m_hasExpectation = true;
  }

  void setExpectNoException()
  {
    m_expectException = false;
    m_hasExpectation = true;
  }

  void setExpectCatchAndPropagateException()
  {
    setExpectException();
    m_shouldPropagateException = true;
  }

  void verify()
  {
    if ( m_hasExpectation )
    {
      CPPUNIT_ASSERT_MESSAGE( "MockProtector::protect() was not called",
                              m_wasCalled );

      std::string message;
      if ( m_expectException )
        message = "did not catch the exception.";
      else
        message = "caught an unexpected exception.";
      CPPUNIT_ASSERT_EQUAL_MESSAGE( "MockProtector::protect() " + message,
                                    m_expectException,
                                    m_wasTrapped );
    }
  }

private:
  bool m_wasCalled;
  bool m_wasTrapped;
  bool m_expectException;
  bool m_hasExpectation;
  bool m_shouldPropagateException;
};


#endif // MOCKPROTECTOR_H