/* ====================================================================
   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.hssf.usermodel;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.io.IOException;

import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.model.InternalWorkbook;
import org.apache.poi.hssf.record.BackupRecord;
import org.apache.poi.hssf.record.LabelSSTRecord;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.record.aggregates.RecordAggregate.RecordVisitor;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Name;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.junit.Test;

/**
 * Class to test Workbook functionality
 */
public final class TestWorkbook {
    private static final String LAST_NAME_KEY        = "lastName";
    private static final String FIRST_NAME_KEY       = "firstName";
    private static final String SSN_KEY              = "ssn";
    private static final String REPLACE_ME           = "replaceMe";
    private static final String REPLACED             = "replaced";
    private static final String DO_NOT_REPLACE       = "doNotReplace";
    private static final String EMPLOYEE_INFORMATION = "Employee Info";
    private static final String LAST_NAME_VALUE      = "Bush";
    private static final String FIRST_NAME_VALUE     = "George";
    private static final String SSN_VALUE            = "555555555";
    private final SanityChecker sanityChecker = new SanityChecker();


    private static HSSFWorkbook openSample(String sampleFileName) {
        return HSSFTestDataSamples.openSampleWorkbook(sampleFileName);
    }

    /**
     * TEST NAME:  Test Write Sheet Simple <P>
     * OBJECTIVE:  Test that HSSF can create a simple spreadsheet with numeric and string values.<P>
     * SUCCESS:    HSSF creates a sheet.  Filesize matches a known good.  HSSFSheet objects
     *             Last row, first row is tested against the correct values (99,0).<P>
     * FAILURE:    HSSF does not create a sheet or excepts.  Filesize does not match the known good.
     *             HSSFSheet last row or first row is incorrect.             <P>
     */
    @Test
    public void testWriteSheetSimple() throws IOException {
        HSSFWorkbook wb1  = new HSSFWorkbook();
        HSSFSheet s = wb1.createSheet();

        for (int rownum = 0; rownum < 100; rownum++) {
            HSSFRow r = s.createRow(rownum);

            for (int cellnum = 0; cellnum < 50; cellnum += 2) {
                HSSFCell c = r.createCell(cellnum);
                c.setCellValue(rownum * 10000 + cellnum
                               + ((( double ) rownum / 1000)
                                  + (( double ) cellnum / 10000)));
                c = r.createCell(cellnum + 1);
                c.setCellValue(new HSSFRichTextString("TEST"));
            }
        }
        
        HSSFWorkbook wb2 = HSSFTestDataSamples.writeOutAndReadBack(wb1);
        
        sanityChecker.checkHSSFWorkbook(wb1);
        assertEquals("LAST ROW == 99", 99, s.getLastRowNum());
        assertEquals("FIRST ROW == 0", 0, s.getFirstRowNum());

        sanityChecker.checkHSSFWorkbook(wb2);
        s = wb2.getSheetAt(0);
        assertEquals("LAST ROW == 99", 99, s.getLastRowNum());
        assertEquals("FIRST ROW == 0", 0, s.getFirstRowNum());
        wb2.close();
        wb1.close();
    }

    /**
     * TEST NAME:  Test Write/Modify Sheet Simple <P>
     * OBJECTIVE:  Test that HSSF can create a simple spreadsheet with numeric and string values,
     *             remove some rows, yet still have a valid file/data.<P>
     * SUCCESS:    HSSF creates a sheet.  Filesize matches a known good.  HSSFSheet objects
     *             Last row, first row is tested against the correct values (74,25).<P>
     * FAILURE:    HSSF does not create a sheet or excepts.  Filesize does not match the known good.
     *             HSSFSheet last row or first row is incorrect.             <P>
     */
    @Test
    public void testWriteModifySheetSimple() throws IOException {
        HSSFWorkbook wb1 = new HSSFWorkbook();
        HSSFSheet s = wb1.createSheet();

        for (int rownum = 0; rownum < 100; rownum++) {
            HSSFRow r = s.createRow(rownum);

            for (int cellnum = 0; cellnum < 50; cellnum += 2) {
                HSSFCell c = r.createCell(cellnum);
                c.setCellValue(rownum * 10000 + cellnum
                               + ((( double ) rownum / 1000)
                                  + (( double ) cellnum / 10000)));
                c = r.createCell(cellnum + 1);
                c.setCellValue(new HSSFRichTextString("TEST"));
            }
        }
        for (int rownum = 0; rownum < 25; rownum++) {
            HSSFRow r = s.getRow(rownum);
            s.removeRow(r);
        }
        for (int rownum = 75; rownum < 100; rownum++) {
            HSSFRow r = s.getRow(rownum);
            s.removeRow(r);
        }

        HSSFWorkbook wb2 = HSSFTestDataSamples.writeOutAndReadBack(wb1);
        
        sanityChecker.checkHSSFWorkbook(wb1);
        assertEquals("LAST ROW == 74", 74, s.getLastRowNum());
        assertEquals("FIRST ROW == 25", 25, s.getFirstRowNum());

        sanityChecker.checkHSSFWorkbook(wb2);
        s = wb2.getSheetAt(0);
        assertEquals("LAST ROW == 74", 74, s.getLastRowNum());
        assertEquals("FIRST ROW == 25", 25, s.getFirstRowNum());
    
        wb2.close();
        wb1.close();
    }

    /**
     * TEST NAME:  Test Read Simple <P>
     * OBJECTIVE:  Test that HSSF can read a simple spreadsheet (Simple.xls).<P>
     * SUCCESS:    HSSF reads the sheet.  Matches values in their particular positions.<P>
     * FAILURE:    HSSF does not read a sheet or excepts.  HSSF cannot identify values
     *             in the sheet in their known positions.<P>
     */
    @Test
    public void testReadSimple() throws IOException {
        HSSFWorkbook wb = openSample("Simple.xls");
        HSSFSheet sheet = wb.getSheetAt(0);

        HSSFCell cell = sheet.getRow(0).getCell(0);
        assertEquals(REPLACE_ME, cell .getRichStringCellValue().getString());
        wb.close();
    }

    /**
     * TEST NAME:  Test Read Simple w/ Data Format<P>
     * OBJECTIVE:  Test that HSSF can read a simple spreadsheet (SimpleWithDataFormat.xls).<P>
     * SUCCESS:    HSSF reads the sheet.  Matches values in their particular positions and format is correct<P>
     * FAILURE:    HSSF does not read a sheet or excepts.  HSSF cannot identify values
     *             in the sheet in their known positions.<P>
     */
    @Test
    public void testReadSimpleWithDataFormat() throws IOException {
        HSSFWorkbook wb = openSample("SimpleWithDataFormat.xls");
        HSSFSheet       sheet    = wb.getSheetAt(0);
        HSSFDataFormat  format   = wb.createDataFormat();
        HSSFCell cell = sheet.getRow(0).getCell(0);

        assertEquals(1.25,cell.getNumericCellValue(), 1e-10);

        assertEquals(format.getFormat(cell.getCellStyle().getDataFormat()), "0.0");
        
        wb.close();
    }

/**
     * TEST NAME:  Test Read/Write Simple w/ Data Format<P>
     * OBJECTIVE:  Test that HSSF can write a sheet with custom data formats and then read it and get the proper formats.<P>
     * SUCCESS:    HSSF reads the sheet.  Matches values in their particular positions and format is correct<P>
     * FAILURE:    HSSF does not read a sheet or excepts.  HSSF cannot identify values
     *             in the sheet in their known positions.<P>
     */
    @Test
    public void testWriteDataFormat() throws IOException {
        HSSFWorkbook wb1 = new HSSFWorkbook();
        HSSFSheet s1 = wb1.createSheet();
        HSSFDataFormat format = wb1.createDataFormat();
        HSSFCellStyle cs = wb1.createCellStyle();

        short df = format.getFormat("0.0");
        cs.setDataFormat(df);

        HSSFCell c1 = s1.createRow(0).createCell(0);
        c1.setCellStyle(cs);
        c1.setCellValue(1.25);

        HSSFWorkbook wb2 = HSSFTestDataSamples.writeOutAndReadBack(wb1);
        wb1.close();

        HSSFSheet s2 = wb2.getSheetAt(0);
        HSSFCell c2 = s2.getRow(0).getCell(0);
        format = wb2.createDataFormat();

        assertEquals(1.25, c2.getNumericCellValue(), 1e-10);

        assertEquals(format.getFormat(df), "0.0");

        assertEquals(format, wb2.createDataFormat());

        wb2.close();
        wb1.close();
    }

    /**
     * TEST NAME:  Test Read Employee Simple <P>
     * OBJECTIVE:  Test that HSSF can read a simple spreadsheet (Employee.xls).<P>
     * SUCCESS:    HSSF reads the sheet.  Matches values in their particular positions.<P>
     * FAILURE:    HSSF does not read a sheet or excepts.  HSSF cannot identify values
     *             in the sheet in their known positions.<P>
     *
     */
    @Test
    public void testReadEmployeeSimple() throws IOException {
        HSSFWorkbook wb = openSample("Employee.xls");
        HSSFSheet sheet = wb.getSheetAt(0);

        assertEquals(EMPLOYEE_INFORMATION, sheet.getRow(1).getCell(1).getRichStringCellValue().getString());
        assertEquals(LAST_NAME_KEY, sheet.getRow(3).getCell(2).getRichStringCellValue().getString());
        assertEquals(FIRST_NAME_KEY, sheet.getRow(4).getCell(2).getRichStringCellValue().getString());
        assertEquals(SSN_KEY, sheet.getRow(5).getCell(2).getRichStringCellValue().getString());
        
        wb.close();
    }

    /**
     * TEST NAME:  Test Modify Sheet Simple <P>
     * OBJECTIVE:  Test that HSSF can read a simple spreadsheet with a string value and replace
     *             it with another string value.<P>
     * SUCCESS:    HSSF reads a sheet.  HSSF replaces the cell value with another cell value. HSSF
     *             writes the sheet out to another file.  HSSF reads the result and ensures the value
     *             has been properly replaced.    <P>
     * FAILURE:    HSSF does not read a sheet or excepts.  HSSF does not write the sheet or excepts.
     *             HSSF does not re-read the sheet or excepts.  Upon re-reading the sheet the value
     *             is incorrect or has not been replaced. <P>
     */
    @Test
    public void testModifySimple() throws IOException {
        HSSFWorkbook wb1 = openSample("Simple.xls");
        HSSFSheet sheet = wb1.getSheetAt(0);
        HSSFCell cell = sheet.getRow(0).getCell(0);

        cell.setCellValue(new HSSFRichTextString(REPLACED));

        HSSFWorkbook wb2 = HSSFTestDataSamples.writeOutAndReadBack(wb1);
        sheet    = wb2.getSheetAt(0);
        cell     = sheet.getRow(0).getCell(0);
        assertEquals(REPLACED, cell.getRichStringCellValue().getString());
        
        wb2.close();
        wb1.close();
    }

    /**
     * TEST NAME:  Test Modify Sheet Simple With Skipped cells<P>
     * OBJECTIVE:  Test that HSSF can read a simple spreadsheet with string values and replace
     *             them with other string values while not replacing other cells.<P>
     * SUCCESS:    HSSF reads a sheet.  HSSF replaces the cell value with another cell value. HSSF
     *             writes the sheet out to another file.  HSSF reads the result and ensures the value
     *             has been properly replaced and unreplaced values are still unreplaced.    <P>
     * FAILURE:    HSSF does not read a sheet or excepts.  HSSF does not write the sheet or excepts.
     *             HSSF does not re-read the sheet or excepts.  Upon re-reading the sheet the value
     *             is incorrect or has not been replaced or the incorrect cell has its value replaced
     *             or is incorrect. <P>
     */
    @Test
    public void testModifySimpleWithSkip() throws IOException {
        HSSFWorkbook wb1 = openSample("SimpleWithSkip.xls");
        HSSFSheet sheet = wb1.getSheetAt(0);
        HSSFCell cell = sheet.getRow(0).getCell(1);

        cell.setCellValue(new HSSFRichTextString(REPLACED));
        cell = sheet.getRow(1).getCell(0);
        cell.setCellValue(new HSSFRichTextString(REPLACED));

        HSSFWorkbook wb2 = HSSFTestDataSamples.writeOutAndReadBack(wb1);

        sheet    = wb2.getSheetAt(0);
        cell     = sheet.getRow(0).getCell(1);
        assertEquals(REPLACED, cell.getRichStringCellValue().getString());
        cell = sheet.getRow(0).getCell(0);
        assertEquals(DO_NOT_REPLACE, cell.getRichStringCellValue().getString());
        cell = sheet.getRow(1).getCell(0);
        assertEquals(REPLACED, cell.getRichStringCellValue().getString());
        cell = sheet.getRow(1).getCell(1);
        assertEquals(DO_NOT_REPLACE, cell.getRichStringCellValue().getString());
        
        wb2.close();
        wb1.close();
    }

    /**
     * TEST NAME:  Test Modify Sheet With Styling<P>
     * OBJECTIVE:  Test that HSSF can read a simple spreadsheet with string values and replace
     *             them with other string values despite any styling.  In this release of HSSF styling will
     *             probably be lost and is NOT tested.<P>
     * SUCCESS:    HSSF reads a sheet.  HSSF replaces the cell values with other cell values. HSSF
     *             writes the sheet out to another file.  HSSF reads the result and ensures the value
     *             has been properly replaced.    <P>
     * FAILURE:    HSSF does not read a sheet or excepts.  HSSF does not write the sheet or excepts.
     *             HSSF does not re-read the sheet or excepts.  Upon re-reading the sheet the value
     *             is incorrect or has not been replaced. <P>
     */
    @Test
    public void testModifySimpleWithStyling() throws IOException {
        HSSFWorkbook wb1 = openSample("SimpleWithStyling.xls");
        HSSFSheet  sheet = wb1.getSheetAt(0);

        for (int k = 0; k < 4; k++) {
            HSSFCell cell = sheet.getRow(k).getCell(0);
            cell.setCellValue(new HSSFRichTextString(REPLACED));
        }

        HSSFWorkbook wb2 = HSSFTestDataSamples.writeOutAndReadBack(wb1);
        sheet    = wb2.getSheetAt(0);
        for (int k = 0; k < 4; k++) {
            HSSFCell cell = sheet.getRow(k).getCell(0);
            assertEquals(REPLACED, cell.getRichStringCellValue().getString());
        }
        
        wb2.close();
        wb1.close();
    }

    /**
     * TEST NAME:  Test Modify Employee Sheet<P>
     * OBJECTIVE:  Test that HSSF can read a simple spreadsheet with string values and replace
     *             them with other string values despite any styling.  In this release of HSSF styling will
     *             probably be lost and is NOT tested.<P>
     * SUCCESS:    HSSF reads a sheet.  HSSF replaces the cell values with other cell values. HSSF
     *             writes the sheet out to another file.  HSSF reads the result and ensures the value
     *             has been properly replaced.    <P>
     * FAILURE:    HSSF does not read a sheet or excepts.  HSSF does not write the sheet or excepts.
     *             HSSF does not re-read the sheet or excepts.  Upon re-reading the sheet the value
     *             is incorrect or has not been replaced. <P>
     */
    @Test
    public void testModifyEmployee() throws IOException {
        HSSFWorkbook wb1 = openSample("Employee.xls");
        HSSFSheet  sheet = wb1.getSheetAt(0);
        HSSFCell    cell = sheet.getRow(3).getCell(2);

        cell.setCellValue(new HSSFRichTextString(LAST_NAME_VALUE));
        cell = sheet.getRow(4).getCell(2);
        cell.setCellValue(new HSSFRichTextString(FIRST_NAME_VALUE));
        cell = sheet.getRow(5).getCell(2);
        cell.setCellValue(new HSSFRichTextString(SSN_VALUE));

        HSSFWorkbook wb2 = HSSFTestDataSamples.writeOutAndReadBack(wb1);
        sheet = wb2.getSheetAt(0);
        assertEquals(EMPLOYEE_INFORMATION, sheet.getRow(1).getCell(1).getRichStringCellValue().getString());
        assertEquals(LAST_NAME_VALUE, sheet.getRow(3).getCell(2).getRichStringCellValue().getString());
        assertEquals(FIRST_NAME_VALUE, sheet.getRow(4).getCell(2).getRichStringCellValue().getString());
        assertEquals(SSN_VALUE, sheet.getRow(5).getCell(2).getRichStringCellValue().getString());
        
        wb2.close();
        wb1.close();
    }

    /**
     * TEST NAME:  Test Read Sheet with an RK number<P>
     * OBJECTIVE:  Test that HSSF can read a simple spreadsheet with and RKRecord and correctly
     *             identify the cell as numeric and convert it to a NumberRecord.  <P>
     * SUCCESS:    HSSF reads a sheet.  HSSF returns that the cell is a numeric type cell.    <P>
     * FAILURE:    HSSF does not read a sheet or excepts.  HSSF incorrectly identifies the cell<P>
     */
    @Test
    public void testReadSheetWithRK() throws IOException {
        HSSFWorkbook wb = openSample("rk.xls");
        HSSFSheet    s  = wb.getSheetAt(0);
        HSSFCell     c  = s.getRow(0).getCell(0);

        assertEquals(CellType.NUMERIC, c.getCellTypeEnum());
        
        wb.close();
    }

    /**
     * TEST NAME:  Test Write/Modify Sheet Simple <P>
     * OBJECTIVE:  Test that HSSF can create a simple spreadsheet with numeric and string values,
     *             remove some rows, yet still have a valid file/data.<P>
     * SUCCESS:    HSSF creates a sheet.  Filesize matches a known good.  HSSFSheet objects
     *             Last row, first row is tested against the correct values (74,25).<P>
     * FAILURE:    HSSF does not create a sheet or excepts.  Filesize does not match the known good.
     *             HSSFSheet last row or first row is incorrect.             <P>
     */
    @Test
    public void testWriteModifySheetMerged() throws IOException {
        HSSFWorkbook wb1 = new HSSFWorkbook();
        HSSFSheet    s   = wb1.createSheet();

        for (int rownum = 0; rownum < 100; rownum++) {
            HSSFRow r = s.createRow(rownum);

            for (int cellnum = 0; cellnum < 50; cellnum += 2) {
                HSSFCell c = r.createCell(cellnum);
                c.setCellValue(rownum * 10000 + cellnum
                               + ((( double ) rownum / 1000)
                                  + (( double ) cellnum / 10000)));
                c = r.createCell(cellnum + 1);
                c.setCellValue(new HSSFRichTextString("TEST"));
            }
        }
        s.addMergedRegion(new CellRangeAddress(0, 10, 0, 10));
        s.addMergedRegion(new CellRangeAddress(30, 40, 5, 15));
        sanityChecker.checkHSSFWorkbook(wb1);
        HSSFWorkbook wb2 = HSSFTestDataSamples.writeOutAndReadBack(wb1);

        s  = wb2.getSheetAt(0);
        CellRangeAddress r1 = s.getMergedRegion(0);
        CellRangeAddress r2 = s.getMergedRegion(1);

        confirmRegion(new CellRangeAddress(0, 10, 0, 10), r1);
        confirmRegion(new CellRangeAddress(30, 40,5, 15), r2);
        
        wb2.close();
        wb1.close();
    }

    private static void confirmRegion(CellRangeAddress ra, CellRangeAddress rb) {
        assertEquals(ra.getFirstRow(), rb.getFirstRow());
        assertEquals(ra.getLastRow(), rb.getLastRow());
        assertEquals(ra.getFirstColumn(), rb.getFirstColumn());
        assertEquals(ra.getLastColumn(), rb.getLastColumn());
    }

    /**
     * Test the backup field gets set as expected.
     * @throws IOException 
     */
    @Test
    public void testBackupRecord() throws IOException {
        HSSFWorkbook wb = new HSSFWorkbook();
		wb.createSheet();
		InternalWorkbook workbook = wb.getWorkbook();
        BackupRecord record   = workbook.getBackupRecord();

        assertEquals(0, record.getBackup());
        assertFalse(wb.getBackupFlag());
        wb.setBackupFlag(true);
        assertEquals(1, record.getBackup());
        assertTrue(wb.getBackupFlag());
        wb.setBackupFlag(false);
        assertEquals(0, record.getBackup());
        assertFalse(wb.getBackupFlag());
        
        wb.close();
    }

    private static final class RecordCounter implements RecordVisitor {
        private int _count;

        public RecordCounter() {
            _count=0;
        }
        public int getCount() {
            return _count;
        }
        @Override
        public void visitRecord(Record r) {
            if (r instanceof LabelSSTRecord) {
                _count++;
            }
        }
    }

    /**
     * This tests is for bug [ #506658 ] Repeating output.
     *
     * We need to make sure only one LabelSSTRecord is produced.
     * @throws IOException 
     */
    @Test
    public void testRepeatingBug() throws IOException {
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet    sheet    = workbook.createSheet("Design Variants");
        HSSFRow      row      = sheet.createRow(2);
        HSSFCell     cell     = row.createCell(1);

        cell.setCellValue(new HSSFRichTextString("Class"));
        cell = row.createCell(2);

        RecordCounter rc = new RecordCounter();
        sheet.getSheet().visitContainedRecords(rc, 0);
        assertEquals(1, rc.getCount());
        
        workbook.close();
    }


    /**
     * Test for row indexes beyond {@link Short#MAX_VALUE}.
     * This bug was first fixed in svn r352609.
     */
    @Test
    public void testRowIndexesBeyond32768() throws IOException {
        HSSFWorkbook wb1 = new HSSFWorkbook();
        HSSFSheet sheet = wb1.createSheet();
        HSSFRow row;
        HSSFCell cell;
        for (int i = 32700; i < 32771; i++) {
            row = sheet.createRow(i);
            cell = row.createCell(0);
            cell.setCellValue(i);
        }
        sanityChecker.checkHSSFWorkbook(wb1);
        assertEquals("LAST ROW == 32770", 32770, sheet.getLastRowNum());
        cell = sheet.getRow(32770).getCell(0);
        double lastVal = cell.getNumericCellValue();

        HSSFWorkbook    wb2 = HSSFTestDataSamples.writeOutAndReadBack(wb1);
        HSSFSheet       s    = wb2.getSheetAt(0);
        row = s.getRow(32770);
        cell = row.getCell(0);
        assertEquals("Value from last row == 32770", lastVal, cell.getNumericCellValue(), 0);
        assertEquals("LAST ROW == 32770", 32770, s.getLastRowNum());
        
        wb2.close();
        wb1.close();
    }

    /**
     * Generate a file to verify repeating rows and cols made it
     */
    @Test
    public void testRepeatingColsRows() throws IOException {
        HSSFWorkbook wb1 = new HSSFWorkbook();
        HSSFSheet sheet = wb1.createSheet("Test Print Titles");

        HSSFRow row = sheet.createRow(0);

        HSSFCell cell = row.createCell(1);
        cell.setCellValue(new HSSFRichTextString("hi"));

        CellRangeAddress cra = CellRangeAddress.valueOf("A1:B1");
        sheet.setRepeatingColumns(cra);
        sheet.setRepeatingRows(cra);

        HSSFWorkbook wb2 = HSSFTestDataSamples.writeOutAndReadBack(wb1);
        sheet = wb2.getSheetAt(0);
        assertEquals("A:B", sheet.getRepeatingColumns().formatAsString());
        assertEquals("1:1", sheet.getRepeatingRows().formatAsString());
        
        wb2.close();
        wb1.close();
    }

    /**
     * Test setRepeatingRowsAndColumns when startRow and startColumn are -1.
     */
    @Test
    public void testRepeatingColsRowsMinusOne() throws IOException
    {
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet("Test Print Titles");

        HSSFRow row = sheet.createRow(0);

        HSSFCell cell = row.createCell(1);
        cell.setCellValue(new HSSFRichTextString("hi"));
        CellRangeAddress cra = new CellRangeAddress(-1, 1, -1, 1);
        try {
            sheet.setRepeatingColumns(cra);
            fail("invalid start index is ignored");
        } catch (IllegalArgumentException e) {}
        
        try {
            sheet.setRepeatingRows(cra);
            fail("invalid start index is ignored");
        } catch (IllegalArgumentException e) {}

        sheet.setRepeatingColumns(null);
        sheet.setRepeatingRows(null);
        
        HSSFTestDataSamples.writeOutAndReadBack(workbook).close();
        
        workbook.close();
    }

    @Test
    public void testAddMergedRegionWithRegion() throws IOException {
        HSSFWorkbook wb1 = new HSSFWorkbook();
        HSSFSheet    s   = wb1.createSheet();

        for (int rownum = 0; rownum < 100; rownum++) {
            HSSFRow r = s.createRow(rownum);

            for (int cellnum = 0; cellnum < 50; cellnum += 2) {
                HSSFCell c = r.createCell(cellnum);
                c.setCellValue(rownum * 10000 + cellnum
                               + ((( double ) rownum / 1000)
                                  + (( double ) cellnum / 10000)));
                c = r.createCell(cellnum + 1);
                c.setCellValue(new HSSFRichTextString("TEST"));
            }
        }
        s.addMergedRegion(new CellRangeAddress(0, 10, 0, 10));
        s.addMergedRegion(new CellRangeAddress(30, 40, 5, 15));
        sanityChecker.checkHSSFWorkbook(wb1);
        HSSFWorkbook wb2 = HSSFTestDataSamples.writeOutAndReadBack(wb1);

        s  = wb2.getSheetAt(0);
        CellRangeAddress r1 = s.getMergedRegion(0);
        CellRangeAddress r2 = s.getMergedRegion(1);

        confirmRegion(new CellRangeAddress(0, 10, 0, 10), r1);
        confirmRegion(new CellRangeAddress(30, 40,5, 15), r2);
        
        wb2.close();
        wb1.close();
    }

    @Test
    public void testBug58085RemoveSheetWithNames() throws Exception {
        HSSFWorkbook wb1 = new HSSFWorkbook();
        Sheet sheet1 = wb1.createSheet("sheet1");
        Sheet sheet2 = wb1.createSheet("sheet2");
        Sheet sheet3 = wb1.createSheet("sheet3");

        sheet1.createRow(0).createCell((short) 0).setCellValue("val1");
        sheet2.createRow(0).createCell((short) 0).setCellValue("val2");
        sheet3.createRow(0).createCell((short) 0).setCellValue("val3");
        
        Name namedCell1 = wb1.createName();
        namedCell1.setNameName("name1");
        String reference1 = "sheet1!$A$1";
        namedCell1.setRefersToFormula(reference1);
        
        Name namedCell2= wb1.createName();
        namedCell2.setNameName("name2");
        String reference2 = "sheet2!$A$1";
        namedCell2.setRefersToFormula(reference2);

        Name namedCell3 = wb1.createName();
        namedCell3.setNameName("name3");
        String reference3 = "sheet3!$A$1";
        namedCell3.setRefersToFormula(reference3);

        Workbook wb2 = HSSFTestDataSamples.writeOutAndReadBack(wb1);
        wb1.close();
        
        Name nameCell = wb2.getName("name1");
        assertEquals("sheet1!$A$1", nameCell.getRefersToFormula());
        nameCell = wb2.getName("name2");
        assertEquals("sheet2!$A$1", nameCell.getRefersToFormula());
        nameCell = wb2.getName("name3");
        assertEquals("sheet3!$A$1", nameCell.getRefersToFormula());
        
        wb2.removeSheetAt(wb2.getSheetIndex("sheet1"));
        
        nameCell = wb2.getName("name1");
        assertEquals("#REF!$A$1", nameCell.getRefersToFormula());
        nameCell = wb2.getName("name2");
        assertEquals("sheet2!$A$1", nameCell.getRefersToFormula());
        nameCell = wb2.getName("name3");
        assertEquals("sheet3!$A$1", nameCell.getRefersToFormula());
        
        wb2.close();
    }
}
