Guest User

Untitled

a guest
Sep 23rd, 2021
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. namespace base {
  4.  
  5. class Clock {
  6.  public:
  7.   virtual int Now() = 0;
  8.   virtual ~Clock() {}
  9. };
  10.  
  11. class DefaultClock : public Clock {
  12.  public:
  13.   DefaultClock() {
  14.     std::cout << "Constructed DefaultClock" << std::endl;
  15.   }
  16.  
  17.   virtual ~DefaultClock() {
  18.     std::cout << "Destroyed DefaultClock" << std::endl;
  19.   }
  20.  
  21.   int Now() override {
  22.     static int now = 42;
  23.     return now++;
  24.   };
  25. };
  26.  
  27. class MockClock : public Clock {
  28.  public:
  29.   MockClock(int fixed) : fixed_(fixed), now_(fixed) {
  30.     std::cout << "Constructed MockClock" << fixed_ << std::endl;
  31.   }
  32.  
  33.   virtual ~MockClock() {
  34.     std::cout << "Destroyed MockClock" << fixed_ << std::endl;
  35.   }
  36.  
  37.   int Now() override { return now_; }
  38.  
  39.   void SetNow(int now) { now_ = now; }
  40.  private:
  41.   int fixed_;
  42.   int now_;
  43. };
  44.  
  45. }
  46.  
  47. // Example class allowing to inject custom Clock.
  48. class Example {
  49.  public:
  50.   static void PrintNow() {
  51.     std::cout << GetClock().Now() << std::endl;
  52.   }
  53.    
  54.   static void SetClockForTesting(base::Clock* clock) {
  55.     *GetClockPtr() = clock;
  56.   }
  57.  
  58.  private:
  59.   static base::Clock** GetClockPtr() {
  60.     static base::Clock* clock = new base::DefaultClock();
  61.     return &clock;
  62.   }
  63.  
  64.   static base::Clock& GetClock() {
  65.       return **GetClockPtr();
  66.   }
  67. };
  68.  
  69. // Test code.
  70. void test() {
  71.   base::MockClock* raw_mock = new base::MockClock(11);
  72.   Example::SetClockForTesting(raw_mock);
  73.   Example::PrintNow();
  74.   raw_mock->SetNow(22);
  75. }
  76.  
  77.  
  78. int main() {
  79.   std::cout << "Start: nothing should be constructed before" << std::endl;
  80.   std::cout << "===========================================" << std::endl;
  81.   Example::PrintNow();
  82.   Example::PrintNow();
  83.   test();
  84.   Example::PrintNow();
  85.   Example::SetClockForTesting(new base::MockClock(33));
  86.   Example::PrintNow();
  87.   std::cout << "======================================" << std::endl;
  88.   std::cout << "End: nothing should be destroyed after" << std::endl;
  89. }
  90.  
Advertisement
Add Comment
Please, Sign In to add comment