public function testPropertyChangeNotifications() { $property = ""; $oldForename1 = ""; $newForename1 = ""; $example = new ModelState(); $example->Forename = "Ryan"; $example->addPropertyChangedNotificationHandler("Forename", function ($newValue, $propertyName, $oldValue) use(&$property, &$oldForename1, &$newForename1) { $property = $propertyName; $oldForename1 = $oldValue; $newForename1 = $newValue; }); $example->Forename = "Bert"; $this->assertEquals("Forename", $property); $this->assertEquals("Ryan", $oldForename1); $this->assertEquals("Bert", $newForename1); $example->Surname = "Kilfedder"; $this->assertNotEquals("Kilfedder", $newForename1); $oldForename2 = ""; $newForename2 = ""; $example->addPropertyChangedNotificationHandler("Forename", function ($new, $propertyName, $old) use(&$oldForename2, &$newForename2) { $oldForename2 = $old; $newForename2 = $new; }); $example->Forename = "Alan"; $this->assertEquals("Alan", $newForename1); $this->assertEquals("Alan", $newForename2); $oldSurname = ""; $newSurname = ""; $example->addPropertyChangedNotificationHandler("Surname", function ($new, $propertyName, $old) use(&$oldSurname, &$newSurname) { $oldSurname = $old; $newSurname = $new; }); $example->Surname = "Smythe"; $this->assertEquals("Kilfedder", $oldSurname); $this->assertEquals("Smythe", $newSurname); $example->addPropertyChangedNotificationHandler("Surname", function ($new, $propertyName, $old) use(&$oldSurname, &$newSurname) { $this->fail("This shouldn't have run because old is the same as new"); }); $example->Surname = "Smythe"; $hit1 = false; $hit2 = false; $example = new ModelState(); $example->Forename = "Forename"; $example->Surname = "Surname"; $example->addPropertyChangedNotificationHandler(["Forename", "Surname"], function ($new, $propertyName, $old) use(&$hit1, &$hit2) { if ($propertyName == "Forename") { $hit1 = $new; } if ($propertyName == "Surname") { $hit2 = $new; } }); $example->Forename = "Bert"; $example->Surname = "Smith"; $this->assertEquals("Bert", $hit1); $this->assertEquals("Smith", $hit2); }