journalTest.cpp
Engine/source/core/util/journal/test/journalTest.cpp
Detailed Description
1 2//----------------------------------------------------------------------------- 3// Copyright (c) 2014 GarageGames, LLC 4// 5// Permission is hereby granted, free of charge, to any person obtaining a copy 6// of this software and associated documentation files (the "Software"), to 7// deal in the Software without restriction, including without limitation the 8// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 9// sell copies of the Software, and to permit persons to whom the Software is 10// furnished to do so, subject to the following conditions: 11// 12// The above copyright notice and this permission notice shall be included in 13// all copies or substantial portions of the Software. 14// 15// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21// IN THE SOFTWARE. 22//----------------------------------------------------------------------------- 23 24#ifdef TORQUE_TESTS_ENABLED 25#include "testing/unitTesting.h" 26#include "core/util/journal/journaledSignal.h" 27#include "core/util/safeDelete.h" 28 29FIXTURE(Journal) 30{ 31public: 32 // Used for basic API test. 33 struct receiver 34 { 35 U16 lastTriggerValue; 36 void trigger(U16 msg) 37 { 38 lastTriggerValue = msg; 39 } 40 }; 41 42 // Used for non-basic test. 43 typedef JournaledSignal<void(U32, U16)> EventA; 44 typedef JournaledSignal<void(U8, S8)> EventB; 45 typedef JournaledSignal<void(U32, S32)> EventC; 46 47 // Root, non-dynamic signal receiver. 48 struct multiReceiver { 49 U32 recvA, recvB, recvC; 50 51 EventA *dynamicA; 52 EventB *dynamicB; 53 EventC *dynamicC; 54 55 void receiverRoot(U8 msg) 56 { 57 if(msg==1) 58 { 59 dynamicA = new EventA(); 60 dynamicA->notify(this, &multiReceiver::receiverA); 61 } 62 63 if(msg==2) 64 { 65 dynamicB = new EventB(); 66 dynamicB->notify(this, &multiReceiver::receiverB); 67 } 68 69 if(msg==3) 70 { 71 dynamicC = new EventC(); 72 dynamicC->notify(this, &multiReceiver::receiverC); 73 } 74 } 75 76 void receiverA(U32, U16 d) 77 { 78 recvA += d; 79 } 80 81 void receiverB(U8, S8 d) 82 { 83 recvB += d; 84 } 85 86 void receiverC(U32, S32 d) 87 { 88 recvC += d; 89 } 90 }; 91}; 92 93TEST_FIX(Journal, BasicAPI) 94{ 95 receiver rec; 96 rec.lastTriggerValue = 0; 97 98 // Set up a journaled signal to test with. 99 JournaledSignal<void(U16)> testEvent; 100 testEvent.notify(&rec, &receiver::trigger); 101 102 // Initialize journal recording and fire off some events... 103 Journal::Record("test.jrn"); 104 ASSERT_TRUE(Journal::IsRecording()); 105 106 testEvent.trigger(16); 107 testEvent.trigger(17); 108 testEvent.trigger(18); 109 110 EXPECT_EQ(rec.lastTriggerValue, 18) 111 << "Should encounter last triggered value (18)."; 112 113 Journal::Stop(); 114 ASSERT_FALSE(Journal::IsRecording()); 115 116 // Clear it... 117 rec.lastTriggerValue = 0; 118 119 // and play back - should get same thing. 120 Journal::Play("test.jrn"); 121 122 // Since we fired 3 events, it should take three loops. 123 EXPECT_TRUE(Journal::PlayNext()) << "Should be two more events."; 124 EXPECT_TRUE(Journal::PlayNext()) << "Should be one more event."; 125 EXPECT_FALSE(Journal::PlayNext()) << "Should be no more events."; 126 127 EXPECT_EQ(rec.lastTriggerValue, 18) 128 << "Should encounter last journaled value (18)."; 129} 130 131TEST_FIX(Journal, DynamicSignals) 132{ 133 multiReceiver rec; 134 135 // Reset our state values. 136 rec.recvA = rec.recvB = rec.recvC = 0; 137 138 // Set up a signal to start with. 139 JournaledSignal<void(U8)> testEvent; 140 testEvent.notify(&rec, &multiReceiver::receiverRoot); 141 142 // Initialize journal recording and fire off some events... 143 Journal::Record("test.jrn"); 144 ASSERT_TRUE(Journal::IsRecording()); 145 146 testEvent.trigger(1); 147 rec.dynamicA->trigger(8, 100); 148 testEvent.trigger(2); 149 rec.dynamicA->trigger(8, 8); 150 rec.dynamicB->trigger(9, 'a'); 151 testEvent.trigger(3); 152 SAFE_DELETE(rec.dynamicB); // Test a deletion. 153 rec.dynamicC->trigger(8, 1); 154 rec.dynamicC->trigger(8, 1); 155 156 // Did we end up with expected values? Check before clearing. 157 EXPECT_EQ(rec.recvA, 108) << "recvA wasn't 108 - something broken in signals?"; 158 EXPECT_EQ(rec.recvB, 'a') << "recvB wasn't 'a' - something broken in signals?"; 159 EXPECT_EQ(rec.recvC, 2) << "recvC wasn't 2 - something broken in signals?"; 160 161 // Reset our state values. 162 rec.recvA = rec.recvB = rec.recvC = 0; 163 164 // And kill the journal... 165 Journal::Stop(); 166 167 // Also kill our remaining dynamic signals. 168 SAFE_DELETE(rec.dynamicA); 169 SAFE_DELETE(rec.dynamicB); 170 SAFE_DELETE(rec.dynamicC); 171 172 // Play back - should get same thing. 173 Journal::Play("test.jrn"); 174 175 // Since we fired 8 events, it should take 7+1=8 loops. 176 for(S32 i = 0; i < 7; i++) 177 { 178 EXPECT_TRUE(Journal::PlayNext()) 179 << "Should be more events."; 180 } 181 182 EXPECT_FALSE(Journal::PlayNext()) 183 << "Should be no more events."; 184 185 EXPECT_EQ(rec.recvA, 108) << "recvA wasn't 108 - something broken in journal?"; 186 EXPECT_EQ(rec.recvB, 'a') << "recvB wasn't 'a' - something broken in journal?"; 187 EXPECT_EQ(rec.recvC, 2) << "recvC wasn't 2 - something broken in journal?"; 188} 189 190#endif 191