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

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

import org.junit.Assert;
import org.junit.Test;

import ru.rsdn.patterns.behavioral.observer.Subscriber;
import ru.rsdn.patterns.behavioral.observer.problems.init.InitNotifyPublisher;

/**
 * Тестирование подписчика, который может привести к утечке памяти, и
 * пересмотр его кода
 */
public class MemoryLeakSubscriberTest extends Subscriber {
	private final InitNotifyPublisher publisher = new InitNotifyPublisher();

	/**
	 * Неграмотная реализация печати содержимого файла
	 * @param file путь
	 * @throws IOException
	 */
	public void unversedPrintFile(String file) throws IOException {
		publisher.subscribe(this);
		final Reader reader = new FileReader(file);
		int i;
		while ((i = reader.read()) != -1)
			System.out.print(i + ' ');
		publisher.unsubscribe(this);
	}

	/**
	 * Тестирование утечки памяти
	 */
	@Test
	public void memoryLeakTest() {
		try {
			unversedPrintFile("Такого файла не существует");
		} catch (final IOException e) {
		}
		Assert.assertTrue(!publisher.getSubscribers().isEmpty());
	}

	/**
	 * Распечатать содержимое файла
	 * @param file путь
	 * @throws IOException
	 */
	public void printFile(String file) throws IOException {
		publisher.subscribe(this);
		Reader reader = null;
		try {
			reader = new FileReader(file);
			int i;
			while ((i = reader.read()) != -1)
				System.out.print(i + ' ');
		} finally {
			publisher.unsubscribe(this);
			if (reader != null)
				reader.close();
		}
	}

	/**
	 * Тестирование отсутствия утечки памяти
	 */
	@Test
	public void memoryNormTest() {
		try {
			printFile("И такого файла тоже не существует");
		} catch (final IOException e) {
		}
		Assert.assertTrue(publisher.getSubscribers().isEmpty());
	}
}
