/*******************************************************************************
 * Copyright (c) 2018 Angelo ZERR.
 *
 * 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:
 * Angelo Zerr <angelo.zerr@gmail.com> - [minimap] Initialize minimap view - Bug 535450
 *******************************************************************************/
package org.eclipse.ui.workbench.texteditor.tests.minimap;

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

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;

import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.TextPresentation;
import org.eclipse.jface.text.TextViewer;

import org.eclipse.ui.internal.views.minimap.MinimapWidget;

/**
 * Minimap widget tests to check that changed of {@link ITextViewer} of the editor update the
 * {@link StyledText} of the Minimap:
 *
 * <ul>
 * <li>check that {@link StyledText} content of minimap is synchronized with the text of the
 * {@link ITextViewer} of the editor.</li>
 * <li>check that {@link StyledText} styles of minimap is synchronized with the styles of the
 * {@link ITextViewer} of the editor.</li>
 * </ul>
 *
 * @since 3.11
 */
public class MinimapWidgetTest {

	private ITextViewer editorViewer;

	private StyledText editorStyledText;

	private StyledText minimapStyledText;

	@Before
	public void createMinimap() {
		Composite parent= new Shell();
		editorViewer= new TextViewer(parent, SWT.NONE);
		MinimapWidget minimapWidget= new MinimapWidget(parent, editorViewer);
		minimapWidget.install();

		editorStyledText= editorViewer.getTextWidget();
		minimapStyledText= (StyledText) minimapWidget.getControl();

	}

	@Test
	public void testMinimapContent() {
		editorStyledText.setText("abcd");
		Assert.assertEquals("abcd", minimapStyledText.getText());

		editorStyledText.replaceTextRange(1, 0, "ABCD");
		Assert.assertEquals("aABCDbcd", minimapStyledText.getText());
	}

	@Test
	public void testMinimapSetStyles() {
		// As it doesn't exists listener to track styles changed of StyledText, update styles directly in StyledText of the editor doesn't update the styles of StyledText of the minimap.
		StyleRange[] orginalMinimapStyles = minimapStyledText.getStyleRanges();
		editorStyledText.setText("abcd");
		StyleRange[] ranges= new StyleRange[] { new StyleRange(0, 1, editorStyledText.getDisplay().getSystemColor(SWT.COLOR_BLACK), null) };
		editorStyledText.setStyleRanges(ranges);
		// Styles of minimap doesn't changed
		Assert.assertArrayEquals(orginalMinimapStyles, minimapStyledText.getStyleRanges());
	}

	@Test
	public void testMinimapSetStylesWithTextPresentation() {
		// Track styles changed of TextPresentation, update the styles of StyledText of the minimap.
		editorStyledText.setText("abcd");

		StyleRange[] ranges= new StyleRange[] { new StyleRange(0, 1, editorStyledText.getDisplay().getSystemColor(SWT.COLOR_BLACK), null) };
		TextPresentation presentation= new TextPresentation();
		presentation.mergeStyleRanges(ranges);
		editorViewer.changeTextPresentation(presentation, false);
		StyleRange[] expectedRanges= new StyleRange[] { new StyleRange(0, 1, editorStyledText.getDisplay().getSystemColor(SWT.COLOR_BLACK), null) };
		Assert.assertArrayEquals(expectedRanges, minimapStyledText.getStyleRanges());

		ranges= new StyleRange[] { new StyleRange(1, 1, editorStyledText.getDisplay().getSystemColor(SWT.COLOR_RED), null) };
		presentation= new TextPresentation();
		presentation.mergeStyleRanges(ranges);
		editorViewer.changeTextPresentation(presentation, false);
		expectedRanges= new StyleRange[] { new StyleRange(0, 1, editorStyledText.getDisplay().getSystemColor(SWT.COLOR_BLACK), null),
				new StyleRange(1, 1, editorStyledText.getDisplay().getSystemColor(SWT.COLOR_RED), null) };
		Assert.assertArrayEquals(expectedRanges, minimapStyledText.getStyleRanges());
	}
}
