/*******************************************************************************
 * Copyright (c) 2012, 2020 Original authors and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Original authors and others - initial API and implementation
 ******************************************************************************/
package org.eclipse.nebula.widgets.nattable.persistence;

import static org.eclipse.nebula.widgets.nattable.persistence.IPersistable.DOT;
import static org.eclipse.nebula.widgets.nattable.persistence.StylePersistor.BG_COLOR_PREFIX;
import static org.eclipse.nebula.widgets.nattable.persistence.StylePersistor.BORDER_PREFIX;
import static org.eclipse.nebula.widgets.nattable.persistence.StylePersistor.FG_COLOR_PREFIX;
import static org.eclipse.nebula.widgets.nattable.persistence.StylePersistor.FONT_PREFIX;
import static org.eclipse.nebula.widgets.nattable.persistence.StylePersistor.H_ALIGNMENT_PREFIX;
import static org.eclipse.nebula.widgets.nattable.persistence.StylePersistor.STYLE_PERSISTENCE_PREFIX;
import static org.eclipse.nebula.widgets.nattable.persistence.StylePersistor.V_ALIGNMENT_PREFIX;
import static org.eclipse.nebula.widgets.nattable.style.CellStyleAttributes.BACKGROUND_COLOR;
import static org.eclipse.nebula.widgets.nattable.style.CellStyleAttributes.FOREGROUND_COLOR;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.util.Properties;

import org.eclipse.nebula.widgets.nattable.style.BorderStyle;
import org.eclipse.nebula.widgets.nattable.style.BorderStyle.LineStyleEnum;
import org.eclipse.nebula.widgets.nattable.style.CellStyleAttributes;
import org.eclipse.nebula.widgets.nattable.style.HorizontalAlignmentEnum;
import org.eclipse.nebula.widgets.nattable.style.Style;
import org.eclipse.nebula.widgets.nattable.style.VerticalAlignmentEnum;
import org.eclipse.nebula.widgets.nattable.test.fixture.CellStyleFixture;
import org.eclipse.nebula.widgets.nattable.test.fixture.PropertiesFixture;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Display;
import org.junit.Before;
import org.junit.Test;

public class StylePersistorTest {
    private static final String TEST_PREFIX = "TEST_PREFIX";
    private PropertiesFixture propertiesFixture;

    @Before
    public void setup() {
        this.propertiesFixture = new PropertiesFixture()
                .addStyleProperties(TEST_PREFIX);
    }

    @Test
    public void persistColorToProperties() throws Exception {
        StylePersistor.saveColor(TEST_PREFIX, this.propertiesFixture,
                CellStyleFixture.TEST_BG_COLOR);

        assertEquals(
                "255,255,255",
                this.propertiesFixture.getProperty(TEST_PREFIX + DOT
                        + ColorPersistor.STYLE_PERSISTENCE_PREFIX));
    }

    @Test
    public void persistStyleSettingsToProperties() throws Exception {
        Properties properties = new Properties();
        StylePersistor.saveStyle(TEST_PREFIX, properties,
                new CellStyleFixture());

        String expectedPrefix = TEST_PREFIX + DOT + STYLE_PERSISTENCE_PREFIX
                + DOT;

        assertEquals(
                "255,255,255",
                properties.getProperty(expectedPrefix + BG_COLOR_PREFIX + DOT
                        + ColorPersistor.STYLE_PERSISTENCE_PREFIX));
        assertEquals(
                "0,0,0",
                properties.getProperty(expectedPrefix + FG_COLOR_PREFIX + DOT
                        + ColorPersistor.STYLE_PERSISTENCE_PREFIX));

        assertEquals("LEFT",
                properties.getProperty(expectedPrefix + H_ALIGNMENT_PREFIX));
        assertEquals("MIDDLE",
                properties.getProperty(expectedPrefix + V_ALIGNMENT_PREFIX));

        assertEquals(CellStyleFixture.TEST_FONT.getFontData()[0].toString(),
                properties.getProperty(expectedPrefix + FONT_PREFIX));
        assertEquals(CellStyleFixture.TEST_BORDER_STYLE.toString(),
                properties.getProperty(expectedPrefix + BORDER_PREFIX));
    }

    @Test
    public void loadPersistedColorSettings() throws Exception {
        Style style = StylePersistor.loadStyle(TEST_PREFIX, this.propertiesFixture);

        Color fgColor = style.getAttributeValue(FOREGROUND_COLOR);
        assertEquals("RGB {100, 110, 120}", fgColor.getRGB().toString());

        Color bgColor = style.getAttributeValue(BACKGROUND_COLOR);
        assertEquals("RGB {200, 210, 220}", bgColor.getRGB().toString());
    }

    @Test
    public void loadPersistedAlignmentSettings() throws Exception {
        Style style = StylePersistor.loadStyle(TEST_PREFIX, this.propertiesFixture);

        HorizontalAlignmentEnum expecetdHAlign = style
                .getAttributeValue(CellStyleAttributes.HORIZONTAL_ALIGNMENT);
        assertEquals(HorizontalAlignmentEnum.LEFT, expecetdHAlign);

        VerticalAlignmentEnum expecetdVAlign = style
                .getAttributeValue(CellStyleAttributes.VERTICAL_ALIGNMENT);
        assertEquals(VerticalAlignmentEnum.TOP, expecetdVAlign);
    }

    @Test
    public void loadFontSettings() throws Exception {
        Style style = StylePersistor.loadStyle(TEST_PREFIX, this.propertiesFixture);

        Font font = style.getAttributeValue(CellStyleAttributes.FONT);
        // workaround on Bug 559884
        if (Display.getDefault().getDPI().x == 144) {
            assertTrue(font.getFontData()[0].toString().contains("|Tahoma|8.5|"));
        } else {
            assertTrue(font.getFontData()[0].toString().contains("|Tahoma|8.25|"));
        }
    }

    @Test
    public void loadBorderStyleSettings() throws Exception {
        Style style = StylePersistor.loadStyle(TEST_PREFIX, this.propertiesFixture);

        BorderStyle borderStyle = style
                .getAttributeValue(CellStyleAttributes.BORDER_STYLE);
        assertEquals(2, borderStyle.getThickness());
        assertEquals(100, borderStyle.getColor().getRed());
        assertEquals(110, borderStyle.getColor().getGreen());
        assertEquals(120, borderStyle.getColor().getBlue());
        assertEquals(LineStyleEnum.DASHDOTDOT, borderStyle.getLineStyle());
    }
}
