package eu.dnetlib.miscutils.observer;


import static org.mockito.Matchers.anyObject;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnit44Runner;

@RunWith(MockitoJUnit44Runner.class)
public class AbstractObservableTest {

	private transient TestObservable observable;
	
	@Mock
	private transient TestWatcher observer;
	
	class TestObservable extends AbstractObservable<TestWatcher> {
	}
	
	interface TestWatcher extends Observer<TestObservable>  {
	}
	
	@Before
	public void setUp() {
		observable = new TestObservable();
	}
	
	@Test
	public void testRemoveDeleteAll() {		
		observable.addObserver(observer);
		observable.notifyObservers();
				
		observable.deleteObservers();
		observable.notifyObservers();
		
		verify(observer, times(1)).update((TestObservable)anyObject(), anyObject());
	}

	@Test
	public void testRemoveDeleteOne() {		
		observable.addObserver(observer);
		observable.notifyObservers();
				
		observable.deleteObserver(observer);
		observable.notifyObservers();
		
		verify(observer, times(1)).update((TestObservable)anyObject(), anyObject());
	}

	
}
