/*******************************************************************************
 * Copyright (c) 2014, 2018 Daniel Rolka and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Daniel Rolka - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.tests.themes;

import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyObject;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.e4.ui.css.swt.theme.IThemeEngine;
import org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.StylingPreferencesHandler;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Listener;
import org.osgi.service.event.Event;

import junit.framework.TestCase;

public class StylingPreferencesHandlerTest extends TestCase {
	public void testHandleEvent() throws Exception {
		//given
		IEclipsePreferences pref1 = mock(IEclipsePreferences.class);
		IEclipsePreferences pref2 = mock(IEclipsePreferences.class);

		StylingPreferencesHandlerTestable handler = spy(new StylingPreferencesHandlerTestable(mock(Display.class)));
		doReturn(new HashSet<>(Arrays.asList(pref1, pref2))).when(handler).getPreferences();
		doReturn(Arrays.asList("pref1.prop1", "pref1.prop2")).when(handler).getOverriddenPropertyNames(pref1);
		doReturn(Arrays.asList("pref2.prop1")).when(handler).getOverriddenPropertyNames(pref2);

		IThemeEngine themeEngine = mock(IThemeEngine.class);

		Map<String, Object> eventParams = new HashMap<>();
		eventParams.put(IThemeEngine.Events.THEME_ENGINE, themeEngine);

		//when
		handler.handleEvent(new Event(IThemeEngine.Events.THEME_CHANGED, eventParams));

		//then
		verify(handler, times(1)).resetOverriddenPreferences();
		verify(themeEngine, times(2)).applyStyles(anyObject(), anyBoolean());
		verify(themeEngine, times(1)).applyStyles(pref1, false);
		verify(themeEngine, times(1)).applyStyles(pref2, false);
	}

	public void testResetOverriddenPreferences() throws Exception {
		//given
		IEclipsePreferences pref1 = mock(IEclipsePreferences.class);
		IEclipsePreferences pref2 = mock(IEclipsePreferences.class);

		StylingPreferencesHandlerTestable handler = spy(new StylingPreferencesHandlerTestable(mock(Display.class)));
		doReturn(new HashSet<>(Arrays.asList(pref1, pref2))).when(handler).getPreferences();
		doReturn(Arrays.asList("pref1.prop1", "pref1.prop2")).when(handler).getOverriddenPropertyNames(pref1);
		doReturn(Arrays.asList("pref2.prop1", "pref2.prop2")).when(handler).getOverriddenPropertyNames(pref2);

		//when
		handler.resetOverriddenPreferences();

		//then
		verify(handler, times(1)).resetOverriddenPreferences(pref1);
		verify(pref1, times(1)).remove("pref1.prop1");
		verify(pref1, times(1)).remove("pref1.prop2");
		verify(handler, times(1)).removeOverriddenPropertyNames(pref1);

		verify(handler, times(1)).resetOverriddenPreferences(pref2);
		verify(pref2, times(1)).remove("pref2.prop1");
		verify(pref2, times(1)).remove("pref2.prop2");
		verify(handler, times(1)).removeOverriddenPropertyNames(pref2);
	}

	public void testGetPreferences() {
		Set<IEclipsePreferences> result = new StylingPreferencesHandler(mock(Display.class)) {
			@Override
			public Set<IEclipsePreferences> getPreferences() {
				return super.getPreferences();
			}
		}.getPreferences();

		assertFalse(result.isEmpty());
	}

	public void testAddOnDisplayDisposed() throws Exception {
		//given
		final Listener listener = mock(Listener.class);

		Display display = mock(Display.class);

		//when
		new StylingPreferencesHandler(display) {
			@Override
			protected Listener createOnDisplayDisposedListener() {
				return listener;
			}
		};

		//then
		verify(display, times(1)).addListener(SWT.Dispose, listener);
	}

	public void testOnDisplayDisposedListener() throws Exception {
		//given
		StylingPreferencesHandlerTestable handler = spy(new StylingPreferencesHandlerTestable(mock(Display.class)));

		Listener listener = handler.createOnDisplayDisposedListener();

		//when
		listener.handleEvent(mock(org.eclipse.swt.widgets.Event.class));

		//then
		verify(handler, times(1)).resetOverriddenPreferences();
	}

	public static class StylingPreferencesHandlerTestable extends StylingPreferencesHandler {
		public StylingPreferencesHandlerTestable(Display display) {
			super(display);
		}

		@Override
		public Set<IEclipsePreferences> getPreferences() {
			return Collections.emptySet();
		}

		@Override
		public void resetOverriddenPreferences() {
			super.resetOverriddenPreferences();
		}

		@Override
		public void resetOverriddenPreferences(IEclipsePreferences preferences) {
			super.resetOverriddenPreferences(preferences);
		}

		@Override
		public List<String> getOverriddenPropertyNames(
				IEclipsePreferences preferences) {
			return null;
		}

		@Override
		public void removeOverriddenPropertyNames(IEclipsePreferences preferences) {
			super.removeOverriddenPropertyNames(preferences);
		}

		@Override
		public Listener createOnDisplayDisposedListener() {
			return super.createOnDisplayDisposedListener();
		}
	}
}
