/*******************************************************************************
 * Copyright (c) 2015 Tasktop Technologies and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Tasktop Technologies - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.tasks.ui.editors;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import org.eclipse.jface.fieldassist.IContentProposalProvider;
import org.eclipse.mylyn.commons.workbench.WorkbenchUtil;
import org.eclipse.mylyn.commons.workbench.editors.CommonTextSupport;
import org.eclipse.mylyn.internal.tasks.ui.OptionsProposalProvider;
import org.eclipse.mylyn.internal.tasks.ui.PersonProposalProvider;
import org.eclipse.mylyn.internal.tasks.ui.editors.LabelsAttributeEditor;
import org.eclipse.mylyn.internal.tasks.ui.editors.MultiSelectionAttributeEditor;
import org.eclipse.mylyn.internal.tasks.ui.editors.SingleSelectionAttributeEditor;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.core.data.TaskData;
import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
import org.eclipse.mylyn.tasks.tests.TaskTestUtil;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;

public class AttributeEditorToolkitTest {
	public class TestAttributeEditorToolkit extends AttributeEditorToolkit {

		private ContentAssistCommandAdapter commandAdapter;

		TestAttributeEditorToolkit(CommonTextSupport textSupport) {
			super(textSupport);
		}

		@Override
		public ContentAssistCommandAdapter createContentAssistCommandAdapter(Control control,
				IContentProposalProvider proposalProvider) {
			commandAdapter = super.createContentAssistCommandAdapter(control, proposalProvider);
			return commandAdapter;
		}

		@Override
		public IContentProposalProvider createContentProposalProvider(AbstractAttributeEditor editor) {
			return super.createContentProposalProvider(editor);
		}
	}

	private TestAttributeEditorToolkit toolkit;

	private TaskAttribute taskAttribute;

	private final FormToolkit formToolkit = new FormToolkit(Display.getCurrent());

	private final TaskDataModel taskDataModel = mock(TaskDataModel.class);

	@SuppressWarnings("restriction")
	@Before
	public void setUp() {
		CommonTextSupport textSupport = mock(CommonTextSupport.class);
		toolkit = spy(new TestAttributeEditorToolkit(textSupport));
		TaskData taskData = TaskTestUtil.createMockTaskData("1");
		taskAttribute = taskData.getRoot();
		when(taskDataModel.getTaskData()).thenReturn(taskData);
	}

	@After
	public void tearDown() {
		formToolkit.dispose();
	}

	@Test
	public void testAdaptSingleSelectionAttributeEditor() {
		SingleSelectionAttributeEditor editor = new SingleSelectionAttributeEditor(taskDataModel, taskAttribute);
		assertNoOptionsProposalProvider(editor);
	}

	@Test
	public void testAdaptMultiSelectionAttributeEditor() {
		MultiSelectionAttributeEditor editor = new MultiSelectionAttributeEditor(taskDataModel, taskAttribute);
		assertNoOptionsProposalProvider(editor);
	}

	private void assertNoOptionsProposalProvider(AbstractAttributeEditor editor) {
		editor.createControl(WorkbenchUtil.getShell(), formToolkit);
		toolkit.adapt(editor);
		verify(toolkit, never()).createContentProposalProvider(any(AbstractAttributeEditor.class));
		verify(toolkit, never()).createContentAssistCommandAdapter(any(Control.class),
				any(IContentProposalProvider.class));
	}

	@Test
	public void testAdaptLabelsAttributeEditor() {
		assertOptionsProposalProvider(true, false);
		assertOptionsProposalProvider(false, false);
		assertOptionsProposalProvider(true, true);
	}

	private void assertOptionsProposalProvider(boolean isMultiSelect, boolean isPerson) {
		taskAttribute.getMetaData().setKind(isPerson ? TaskAttribute.KIND_PEOPLE : TaskAttribute.KIND_DEFAULT);
		taskAttribute.getMetaData()
				.setType(isMultiSelect ? TaskAttribute.TYPE_MULTI_SELECT : TaskAttribute.TYPE_SINGLE_SELECT);
		LabelsAttributeEditor editor = new LabelsAttributeEditor(taskDataModel, taskAttribute);
		editor.createControl(WorkbenchUtil.getShell(), formToolkit);
		toolkit.adapt(editor);

		verify(toolkit).createContentProposalProvider(editor);
		ArgumentCaptor<IContentProposalProvider> providerCaptor = ArgumentCaptor
				.forClass(IContentProposalProvider.class);
		verify(toolkit).createContentAssistCommandAdapter(eq(editor.getControl()), providerCaptor.capture());
		IContentProposalProvider proposalProvider = providerCaptor.getValue();
		if (isPerson) {
			assertTrue(proposalProvider instanceof PersonProposalProvider);
		} else {
			assertTrue(proposalProvider instanceof OptionsProposalProvider);
			assertEquals(isMultiSelect, ((OptionsProposalProvider) proposalProvider).isMultiSelect());
		}
		assertNull(toolkit.commandAdapter.getAutoActivationCharacters());
	}

}
