/**************************************************************
 * 
 * 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 ifc.sheet;

import lib.MultiMethodTest;
import lib.Status;
import lib.StatusException;

import com.sun.star.sheet.SubTotalColumn;
import com.sun.star.sheet.XSpreadsheet;
import com.sun.star.sheet.XSubTotalCalculatable;
import com.sun.star.sheet.XSubTotalDescriptor;
import com.sun.star.uno.UnoRuntime;


public class _XSubTotalCalculatable extends MultiMethodTest {
    public XSubTotalCalculatable oObj;
    protected XSubTotalDescriptor desc;
    protected XSpreadsheet oSheet;

    protected void before() {
        oSheet = (XSpreadsheet) tEnv.getObjRelation("SHEET");

        if (oSheet == null) {
            log.println("Object relation oSheet is missing");
            log.println("Trying to query the needed Interface");
            oSheet = (XSpreadsheet) UnoRuntime.queryInterface(
                             XSpreadsheet.class, tEnv.getTestObject());

            if (oSheet == null) {
                throw new StatusException(Status.failed(
                                                  "Object relation oSheet is missing"));
            }
        }
    }

    public void _applySubTotals() {
        requiredMethod("createSubTotalDescriptor()");

        boolean res = true;

        try {
            oSheet.getCellByPosition(0, 0).setFormula("first");
            oSheet.getCellByPosition(1, 0).setFormula("second");
            oSheet.getCellByPosition(0, 3).setFormula("");
            oSheet.getCellByPosition(0, 1).setValue(5);
            oSheet.getCellByPosition(0, 2).setValue(5);
            oSheet.getCellByPosition(1, 1).setValue(17);
            oSheet.getCellByPosition(1, 2).setValue(25);
            oObj.applySubTotals(desc, true);

            String formula = oSheet.getCellByPosition(0, 3).getFormula();
            String expected = "=SUBTOTAL(9;$A$2:$A$3)";
            res = formula.equals(expected);

            if (!res) {
                log.println("getting: " + formula);
                log.println("expected: " + expected);
            }
        } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
            log.println("Couldn't fill cells" + e.getLocalizedMessage());
            res = false;
        }

        tRes.tested("applySubTotals()", res);
    }

    public void _createSubTotalDescriptor() {
        desc = oObj.createSubTotalDescriptor(true);

        SubTotalColumn[] columns = new SubTotalColumn[1];
        columns[0] = new SubTotalColumn();
        columns[0].Column = 0;
        columns[0].Function = com.sun.star.sheet.GeneralFunction.SUM;
        desc.addNew(columns, 0);
        tRes.tested("createSubTotalDescriptor()", true);
    }

    public void _removeSubTotals() {
        requiredMethod("applySubTotals()");

        boolean res = true;

        try {
            oObj.removeSubTotals();

            String formula = oSheet.getCellByPosition(0, 3).getFormula();
            String expected = "";
            res = formula.equals(expected);

            if (!res) {
                log.println("getting: " + formula);
                log.println("expected: " + expected);
            }
        } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
            log.println("Couldn't get cell" + e.getLocalizedMessage());
        }

        tRes.tested("removeSubTotals()", res);
    }
}