/* ====================================================================
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
==================================================================== */
package org.apache.poi.xslf.usermodel;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

import java.io.IOException;

import org.apache.poi.sl.usermodel.Placeholder;
import org.junit.Test;
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties;

/**
 * @author Yegor Kozlov
 */
public class TestXSLFTextBox {

    @Test
    public void testPlaceholder() throws IOException {
        XMLSlideShow ppt = new XMLSlideShow();
        XSLFSlide slide = ppt.createSlide();

        XSLFTextBox shape = slide.createTextBox();
        assertNull(shape.getTextType());
        shape.setPlaceholder(Placeholder.TITLE);
        assertEquals(Placeholder.TITLE, shape.getTextType());
        shape.setPlaceholder(null);
        assertNull(shape.getTextType());
        shape.setText("Apache POI");
        
        ppt.close();
    }

    /**
     * text box inherits default text proeprties from presentation.xml
     */
    @Test
    public void testDefaultTextStyle() throws IOException {
        XMLSlideShow ppt = new XMLSlideShow();
        XSLFSlide slide = ppt.createSlide();

        // default character properties for paragraphs with level=1
        CTTextCharacterProperties pPr = ppt.getCTPresentation().getDefaultTextStyle().getLvl1PPr().getDefRPr();

        XSLFTextBox shape = slide.createTextBox();
        shape.setText("Apache POI");
        assertEquals(1, shape.getTextParagraphs().size());
        assertEquals(1, shape.getTextParagraphs().get(0).getTextRuns().size());

        XSLFTextRun r = shape.getTextParagraphs().get(0).getTextRuns().get(0);

        assertEquals(1800, pPr.getSz());
        assertEquals(18.0, r.getFontSize(), 0);
        assertEquals("Calibri", r.getFontFamily());

        pPr.setSz(900);
        pPr.getLatin().setTypeface("Arial");
        assertEquals(9.0, r.getFontSize(), 0);
        assertEquals("Arial", r.getFontFamily());

        // unset font size in presentation.xml. The value should be taken from master slide
        // from /p:sldMaster/p:txStyles/p:otherStyle/a:lvl1pPr/a:defRPr
        ppt.getCTPresentation().getDefaultTextStyle().getLvl1PPr().getDefRPr().unsetSz();
        pPr = slide.getSlideMaster().getXmlObject().getTxStyles().getOtherStyle().getLvl1PPr().getDefRPr();
        assertEquals(1800, pPr.getSz());
        assertEquals(18.0, r.getFontSize(), 0);
        pPr.setSz(2000);
        assertEquals(20.0, r.getFontSize(), 0);

        pPr.unsetSz();  // Should never be
        assertNull(r.getFontSize());
        
        ppt.close();
    }
}