package ru.rsdn.patterns.behavioral.observer.problems.thread;

import java.util.Collections;
import java.util.ConcurrentModificationException;
import java.util.Vector;

import org.junit.Test;

import ru.rsdn.patterns.behavioral.observer.ISubscriber;

/**
 * Тестирование издателя со списком подписчиков на основе java.util.Vector
 */
public class VectorPublisherTest extends
		AbstractPublisherTest<Vector<ISubscriber>> {
	public VectorPublisherTest() {
		super(new Vector<ISubscriber>());
	}

	@Override
	@Test(expected = ArrayIndexOutOfBoundsException.class)
	public void unsafeNotifyByCycle() {
		super.unsafeNotifyByCycle();
	}

	@Override
	@Test(expected = ConcurrentModificationException.class)
	public void unsafeNotifyByIterator() {
		super.unsafeNotifyByIterator();
	}

	/**
	 * Безопасное оповещение подписчиков на основе перебора циклом
	 * блокированного списка
	 */
	@Test()
	public void safeNotifyByCycleOnSynchronize() {
		synchronized (subscribers) {
			super.unsafeNotifyByCycle();
		}
	}

	/**
	 * Безопасное оповещение подписчиков на основе перебора копии списка
	 */
	@Test()
	public void safeNotifyByCycleOnCopy() {
		subscribe(subscriber);
		final Vector<ISubscriber> subscribersCopy = new Vector<ISubscriber>();
		Collections.copy(subscribers, subscribersCopy);
		unsafeNotifyByCycle(subscribersCopy);
	}
}
