diff options
Diffstat (limited to 'ext/spl/tests/observer_001.phpt')
| -rw-r--r-- | ext/spl/tests/observer_001.phpt | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/ext/spl/tests/observer_001.phpt b/ext/spl/tests/observer_001.phpt new file mode 100644 index 0000000..e7d72b9 --- /dev/null +++ b/ext/spl/tests/observer_001.phpt @@ -0,0 +1,116 @@ +--TEST-- +SPL: SplObserver and SplSubject (empty notify) +--FILE-- +<?php + +class ObserverImpl implements SplObserver +{ + protected $name = ''; + + function __construct($name = 'obj') + { + $this->name = '$' . $name; + } + + function update(SplSubject $subject) + { + echo $this->name . '->' . __METHOD__ . '(' . $subject->getName() . ");\n"; + } + + function getName() + { + return $this->name; + } +} + +class SubjectImpl implements SplSubject +{ + protected $name = ''; + protected $observers = array(); + + function __construct($name = 'sub') + { + $this->name = '$' . $name; + } + + function attach(SplObserver $observer) + { + echo '$sub->' . __METHOD__ . '(' . $observer->getName() . ");\n"; + if (!in_array($observer, $this->observers)) + { + $this->observers[] = $observer; + } + } + + function detach(SplObserver $observer) + { + echo '$sub->' . __METHOD__ . '(' . $observer->getName() . ");\n"; + $idx = array_search($observer, $this->observers); + if ($idx !== false) + { + unset($this->observers[$idx]); + } + } + + function notify() + { + echo '$sub->' . __METHOD__ . "();\n"; + foreach($this->observers as $observer) + { + $observer->update($this); + } + } + + function getName() + { + return $this->name; + } +} + +$sub = new SubjectImpl; + +$ob1 = new ObserverImpl("ob1"); +$ob2 = new ObserverImpl("ob2"); +$ob3 = new ObserverImpl("ob3"); + +$sub->attach($ob1); +$sub->attach($ob1); +$sub->attach($ob2); +$sub->attach($ob3); + +$sub->notify(); + +$sub->detach($ob3); + +$sub->notify(); + +$sub->detach($ob2); +$sub->detach($ob1); + +$sub->notify(); + +$sub->attach($ob3); + +$sub->notify(); +?> +===DONE=== +--EXPECT-- +$sub->SubjectImpl::attach($ob1); +$sub->SubjectImpl::attach($ob1); +$sub->SubjectImpl::attach($ob2); +$sub->SubjectImpl::attach($ob3); +$sub->SubjectImpl::notify(); +$ob1->ObserverImpl::update($sub); +$ob2->ObserverImpl::update($sub); +$ob3->ObserverImpl::update($sub); +$sub->SubjectImpl::detach($ob3); +$sub->SubjectImpl::notify(); +$ob1->ObserverImpl::update($sub); +$ob2->ObserverImpl::update($sub); +$sub->SubjectImpl::detach($ob2); +$sub->SubjectImpl::detach($ob1); +$sub->SubjectImpl::notify(); +$sub->SubjectImpl::attach($ob3); +$sub->SubjectImpl::notify(); +$ob3->ObserverImpl::update($sub); +===DONE=== |
