/* ====================================================================
   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.assertSame;
import static org.junit.Assert.assertTrue;

import java.awt.Dimension;
import java.awt.geom.Rectangle2D;

import org.junit.Test;

/**
 * @author Yegor Kozlov
 */
public class TestXSLFGroupShape {

    @Test
    public void testCreateShapes() throws Exception {
        XMLSlideShow ppt = new XMLSlideShow();
        XSLFSlide slide = ppt.createSlide();

        ppt.setPageSize(new Dimension(792, 612));
        
        XSLFGroupShape group = slide.createGroup();
        assertEquals(1, slide.getShapes().size());

        Rectangle2D interior = new Rectangle2D.Double(-10, -10, 20, 20);
        group.setInteriorAnchor(interior);
        assertEquals(interior, group.getInteriorAnchor());

        Rectangle2D anchor = new Rectangle2D.Double(0, 0, 792, 612);
        group.setAnchor(anchor);
        assertEquals(anchor, group.getAnchor());

        assertTrue(group.getShapes().isEmpty());

        XSLFTextBox shape1 = group.createTextBox();
        assertEquals(1, group.getShapes().size());
        assertSame(shape1, group.getShapes().get(0));
        assertEquals(3, shape1.getShapeId());

        XSLFAutoShape shape2 = group.createAutoShape();
        assertEquals(2, group.getShapes().size());
        assertSame(shape1, group.getShapes().get(0));
        assertSame(shape2, group.getShapes().get(1));
        assertEquals(4, shape2.getShapeId());

        XSLFConnectorShape shape3 = group.createConnector();
        assertEquals(3, group.getShapes().size());
        assertSame(shape3, group.getShapes().get(2));
        assertEquals(5, shape3.getShapeId());

        XSLFGroupShape shape4 = group.createGroup();
        assertEquals(4, group.getShapes().size());
        assertSame(shape4, group.getShapes().get(3));
        assertEquals(6, shape4.getShapeId());

        group.removeShape(shape2);
        assertEquals(3, group.getShapes().size());
        assertSame(shape1, group.getShapes().get(0));
        assertSame(shape3, group.getShapes().get(1));
        assertSame(shape4, group.getShapes().get(2));

        group.removeShape(shape3);
        assertEquals(2, group.getShapes().size());
        assertSame(shape1, group.getShapes().get(0));
        assertSame(shape4, group.getShapes().get(1));

        group.removeShape(shape1);
        group.removeShape(shape4);
        assertTrue(group.getShapes().isEmpty());
        
        ppt.close();
    }

    @Test
    public void testRemoveShapes() throws Exception {
        XMLSlideShow ppt = new XMLSlideShow();
        XSLFSlide slide = ppt.createSlide();

        XSLFGroupShape group1 = slide.createGroup();
        group1.createTextBox();
        XSLFGroupShape group2 = slide.createGroup();
        group2.createTextBox();
        XSLFGroupShape group3 = slide.createGroup();
        slide.removeShape(group1);
        slide.removeShape(group2);
        slide.removeShape(group3);

        ppt.close();
    }
}