/**
 *  Copyright (c) 2018 Angelo ZERR.
 *  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:
 *  Angelo Zerr <angelo.zerr@gmail.com> - StyledText.setStyleRange resets less cache - Bug 530019
 */
package org.eclipse.swt.tests.junit;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.TextLayout;
import org.eclipse.swt.widgets.Shell;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

/**
 * Automated Test Suite for class org.eclipse.swt.custom.StyledText to check there is no regression with Bug 530019
 *
 * @see org.eclipse.swt.custom.StyledText
 */
public class Test_org_eclipse_swt_custom_StyledText_VariableLineHeight {

	Shell shell;
	StyledText styledText;

	@Before
	public void setUp() {
		shell = new Shell();
		styledText = new StyledText(shell, SWT.NULL);
		styledText.setLineSpacingProvider(l -> 0);
	}

	@After
	public void tearDown() {
		shell.dispose();
	}

	@Test
	public void testRise() {
		styledText.setText("a\nb\nc\nd");
		int length = styledText.getCharCount();

		// No style
		assertVariableLineHeightEquals(0, 0);

		// style with rise=1
		StyleRange style = new StyleRange();
		style.start = 0;
		style.length = length;
		style.rise = 1;
		styledText.replaceStyleRanges(0, length, new StyleRange[] { style });
		assertVariableLineHeightEquals(1, 0);

		// style with rise=0
		style = new StyleRange();
		style.start = 0;
		style.length = length;
		style.rise = 0;
		styledText.replaceStyleRanges(0, length, new StyleRange[] { style });
		assertVariableLineHeightEquals(0, 0);

		// style with rise=2
		style = new StyleRange();
		style.start = 0;
		style.length = length;
		style.rise = 2;
		styledText.replaceStyleRanges(0, length, new StyleRange[] { style });
		assertVariableLineHeightEquals(2, 0);

		// style with rise=2 again
		style = new StyleRange();
		style.start = 0;
		style.length = length;
		style.rise = 2;
		styledText.replaceStyleRanges(0, length, new StyleRange[] { style });
		assertVariableLineHeightEquals(2, 0);
	}

	@Test
	public void testFont() {
		styledText.setText("a\nb\nc\nd");

		// Create little, big font
		Font initialFont = styledText.getFont();
		FontData[] fontData = initialFont.getFontData();
		for (int i = 0; i < fontData.length; i++) {
			fontData[i].setHeight(24);
		}
		Font bigFont = new Font(styledText.getDisplay(), fontData);
		fontData = initialFont.getFontData();
		for (int i = 0; i < fontData.length; i++) {
			fontData[i].setHeight(fontData[i].getHeight() - 1);
		}
		Font littleFont = new Font(styledText.getDisplay(), fontData);

		int length = styledText.getCharCount();

		// No style
		assertVariableLineHeightEquals(0, 0);

		// style with big font
		StyleRange style = new StyleRange();
		style.start = 0;
		style.length = length;
		style.foreground = styledText.getDisplay().getSystemColor(SWT.COLOR_BLUE);
		style.font = bigFont;
		styledText.replaceStyleRanges(0, length, new StyleRange[] { style });
		assertVariableLineHeightEquals(0, 0, bigFont);

		// style with no font
		style = new StyleRange();
		style.start = 0;
		style.length = length;
		style.foreground = styledText.getDisplay().getSystemColor(SWT.COLOR_BLUE);
		style.font = null;
		styledText.replaceStyleRanges(0, length, new StyleRange[] { style });
		assertVariableLineHeightEquals(0, 0);

		// style with big font
		style = new StyleRange();
		style.start = 0;
		style.length = length;
		style.foreground = styledText.getDisplay().getSystemColor(SWT.COLOR_BLUE);
		style.font = bigFont;
		styledText.replaceStyleRanges(0, length, new StyleRange[] { style });
		assertVariableLineHeightEquals(0, 0, bigFont);

		// style with little font
		style = new StyleRange();
		style.start = 0;
		style.length = length;
		style.foreground = styledText.getDisplay().getSystemColor(SWT.COLOR_BLUE);
		style.font = littleFont;
		styledText.replaceStyleRanges(0, length, new StyleRange[] { style });
		assertVariableLineHeightEquals(0, 0);

		// style with no font
		style = new StyleRange();
		style.start = 0;
		style.length = length;
		style.foreground = styledText.getDisplay().getSystemColor(SWT.COLOR_BLUE);
		style.font = null;
		styledText.replaceStyleRanges(0, length, new StyleRange[] { style });
		assertVariableLineHeightEquals(0, 0);

		// style with little font
		style = new StyleRange();
		style.start = 0;
		style.length = length;
		style.foreground = styledText.getDisplay().getSystemColor(SWT.COLOR_BLUE);
		style.font = littleFont;
		styledText.replaceStyleRanges(0, length, new StyleRange[] { style });
		assertVariableLineHeightEquals(0, 0);

		bigFont.dispose();
		littleFont.dispose();
	}

	@Test
	public void testLittleFontSeveralRanges() {
		styledText.setText("abc\nd");

		// Create little, big font
		Font initialFont = styledText.getFont();
		FontData[] fontData = initialFont.getFontData();
		for (int i = 0; i < fontData.length; i++) {
			fontData[i].setHeight(fontData[i].getHeight() / 2);
		}
		Font littleFont1 = new Font(styledText.getDisplay(), fontData);
		fontData = initialFont.getFontData();
		for (int i = 0; i < fontData.length; i++) {
			fontData[i].setHeight(fontData[i].getHeight() / 4);
		}
		Font littleFont2 = new Font(styledText.getDisplay(), fontData);

		StyleRange[] ranges = new StyleRange[2];
		ranges[0] = new StyleRange();
		ranges[0].start = 0;
		ranges[0].length = 1;
		ranges[0].font = littleFont1;

		ranges[1] = new StyleRange();
		ranges[1].start = 1;
		ranges[1].length = 1;
		ranges[1].font = littleFont2;

		styledText.replaceStyleRanges(0, 3,ranges);
		// 2 little fonts, line height is the height of the default font of StyledText
		assertVariableLineHeightEquals(0, 0);

		littleFont1.dispose();
		littleFont2.dispose();
	}

	@Test
	public void testBigFontSeveralRanges() {
		styledText.setText("abc\nd");

		// Create little, big font
		Font initialFont = styledText.getFont();
		FontData[] fontData = initialFont.getFontData();
		for (int i = 0; i < fontData.length; i++) {
			fontData[i].setHeight(fontData[i].getHeight() * 2);
		}
		Font bigFont = new Font(styledText.getDisplay(), fontData);
		fontData = initialFont.getFontData();
		for (int i = 0; i < fontData.length; i++) {
			fontData[i].setHeight(fontData[i].getHeight() / 2);
		}
		Font littleFont = new Font(styledText.getDisplay(), fontData);


		StyleRange[] ranges = new StyleRange[2];
		ranges[0] = new StyleRange();
		ranges[0].start = 0;
		ranges[0].length = 1;
		ranges[0].font = bigFont;

		ranges[1] = new StyleRange();
		ranges[1].start = 1;
		ranges[1].length = 1;
		ranges[1].font = littleFont;

		styledText.replaceStyleRanges(0, 3,ranges);
		// line height is the height of the big font
		assertVariableLineHeightEquals(0, 0, bigFont);

		bigFont.dispose();
		littleFont.dispose();
	}

	private void assertVariableLineHeightEquals(int expected, int lineIndex) {
		assertVariableLineHeightEquals(expected, lineIndex, null);
	}

	private void assertVariableLineHeightEquals(int expected, int lineIndex, Font font) {
		int fontHeight = styledText.getLineHeight();
		if (font != null) {
			TextLayout layout = new TextLayout(font.getDevice());
			layout.setFont(font);
			layout.setText("a");
			fontHeight = layout.getBounds().height;
			layout.dispose();
		}
		int actual = styledText.getLinePixel(lineIndex + 1) - styledText.getLinePixel(lineIndex) - fontHeight;
		Assert.assertEquals(expected, actual);
	}

}