InvokeNonPublicStaticMethod(MetaModel::class, 'InitExtensions', []); // Instantiate the new object $this->InvokeNonPublicStaticMethod(PluginManager::class, 'ResetPlugins', []); ObjectModifyExtension::SetCallBack([ApplicationObjectExtensionTest::class, 'IncrementCallCount']); } public function tearDown(): void { ObjectModifyExtension::SetModifications('Person', 'name', 0); ObjectModifyExtension::SetAlwaysChanged(false); ObjectModifyExtension::SetCallBack(null); parent::tearDown(); } public static function IncrementCallCount(string $sOrigin) { self::$aCalls[$sOrigin] = (self::$aCalls[$sOrigin] ?? 0) + 1; self::$iCalls++; } public static function ResetCallCount() { self::$aCalls = []; self::$iCalls = 0; } public function testUpdateReentranceProtection() { // Check that extension is called $oPerson = $this->CreatePerson(1); $oPerson->Set('first_name', 'testUpdateReentranceProtection'); ObjectModifyExtension::SetModifications('Person', 'name', 1); self::ResetCallCount(); $oPerson->DBUpdate(); $this->assertEquals(1, self::$iCalls); // Check that loop limit is 10 $i = 15; self::ResetCallCount(); ObjectModifyExtension::SetModifications('Person', 'name', $i); $oPerson->Set('first_name', 'testUpdateReentranceProtection'); $oPerson->DBUpdate(); $this->assertEquals(10, self::$iCalls); } public function testModificationsLost() { self::ResetCallCount(); $oPerson = $this->CreatePerson(1); $oPerson->Set('first_name', 'testUpdateReentranceProtection'); ObjectModifyExtension::SetModifications('Person', 'name', 1); ObjectModifyExtension::SetAlwaysChanged(true); $oPerson->DBUpdate(); $this->assertEquals(1, self::$iCalls); } }