/*******************************************************************************
 * Copyright (c) 2017 Red Hat Inc. 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:
 *     Mickael Istria (Red Hat Inc.)
 *******************************************************************************/
package org.eclipse.ui.genericeditor.tests;

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

import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.widgets.Control;

import org.eclipse.core.commands.Command;

import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.handlers.IHandlerService;

import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;

public class EditorTest extends AbstratGenericEditorTest{

	@Test
	public void testGenericEditorHasWordWrap() throws Exception {
		this.editor.setFocus();
		final StyledText editorTextWidget = (StyledText) this.editor.getAdapter(Control.class);
		Assert.assertFalse(editorTextWidget.getWordWrap());
		Assert.assertFalse(this.editor.isWordWrapEnabled());
		// Toggle word wrap
		ICommandService commandService = PlatformUI.getWorkbench().getService(ICommandService.class);
		Command wordWrapCommand = commandService.getCommand(ITextEditorActionDefinitionIds.WORD_WRAP);
		Assert.assertTrue(wordWrapCommand.isDefined());
		Assert.assertTrue(wordWrapCommand.isEnabled());
		Assert.assertTrue(wordWrapCommand.isHandled());
		PlatformUI.getWorkbench().getService(IHandlerService.class).executeCommand(wordWrapCommand.getId(), null);
		//
		Assert.assertTrue(editorTextWidget.getWordWrap());
		Assert.assertTrue(this.editor.isWordWrapEnabled());
	}
	
	@Test
	public void testGenericEditorCanShowWhitespaceCharacters() throws Exception {
		this.editor.setFocus();
		// Toggle word wrap
		ICommandService commandService = PlatformUI.getWorkbench().getService(ICommandService.class);
		Command wordWrapCommand = commandService.getCommand(ITextEditorActionDefinitionIds.SHOW_WHITESPACE_CHARACTERS);
		Assert.assertTrue(wordWrapCommand.isDefined());
		Assert.assertTrue(wordWrapCommand.isEnabled());
		Assert.assertTrue(wordWrapCommand.isHandled());
		PlatformUI.getWorkbench().getService(IHandlerService.class).executeCommand(wordWrapCommand.getId(), null);
	}

	@Test
	public void testGenericEditorCanUseBlockSelection() throws Exception {
		this.editor.setFocus();
		Assert.assertFalse(this.editor.isBlockSelectionModeEnabled());
		// Toggle word wrap
		ICommandService commandService = PlatformUI.getWorkbench().getService(ICommandService.class);
		Command wordWrapCommand = commandService.getCommand(ITextEditorActionDefinitionIds.BLOCK_SELECTION_MODE);
		Assert.assertTrue(wordWrapCommand.isDefined());
		Assert.assertTrue(wordWrapCommand.isEnabled());
		Assert.assertTrue(wordWrapCommand.isHandled());
		PlatformUI.getWorkbench().getService(IHandlerService.class).executeCommand(wordWrapCommand.getId(), null);
		//
		Assert.assertTrue(this.editor.isBlockSelectionModeEnabled());
	}
}
