blob: 373e8379e2b61d215a9c3b50c948beeff60d8a51 [file] [log] [blame]
/**************************************************************
*
* 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 fvt.uno.sc.data;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openoffice.test.uno.UnoApp;
import testlib.uno.SCUtil;
import com.sun.star.beans.PropertyValue;
import com.sun.star.lang.XComponent;
import com.sun.star.sheet.XCellAddressable;
import com.sun.star.sheet.XCellRangeData;
import com.sun.star.sheet.XSpreadsheet;
import com.sun.star.sheet.XSpreadsheetDocument;
import com.sun.star.table.CellAddress;
import com.sun.star.table.TableSortField;
import com.sun.star.table.XCell;
import com.sun.star.table.XCellRange;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.util.XSortable;
public class DataSort {
UnoApp unoApp = new UnoApp();
XSpreadsheetDocument scDocument = null;
XComponent scComponent = null;
@Before
public void setUpDocument() throws Exception {
unoApp.start();
// New a SC document
scComponent = unoApp.newDocument("scalc");
}
@After
public void tearDownDocument() {
unoApp.close();
unoApp.closeDocument(scComponent);
}
@BeforeClass
public static void setUpConnection() throws Exception {
}
@AfterClass
public static void tearDownConnection() throws InterruptedException,
Exception {
}
/**
* test single field sort
*/
@Test
public void singleFieldSort() throws Exception {
scDocument = SCUtil.getSCDocument(scComponent);
XSpreadsheet currentsheet = SCUtil.getCurrentSheet(scDocument);
XCellRange sourceRange = currentsheet.getCellRangeByName("A1:E8");
XCellRangeData sourceData = (XCellRangeData) UnoRuntime.queryInterface(
XCellRangeData.class, sourceRange);
Object[][] Source = { { "Level", "Code", "No.", "Team", "Name" },
{ "BS", 20, 4, "B", "Elle" }, { "BS", 20, 6, "C", "Sweet" },
{ "BS", 20, 2, "A", "Chcomic" }, { "CS", 30, 5, "A", "Ally" },
{ "MS", 10, 1, "A", "Joker" }, { "MS", 10, 3, "B", "Kevin" },
{ "CS", 30, 7, "C", "Tom" } };
sourceData.setDataArray(Source);
// define the fields to sort
TableSortField[] aSortFields = new TableSortField[1];
aSortFields[0] = new TableSortField();
aSortFields[0].Field = 1;
aSortFields[0].IsAscending = true;
aSortFields[0].IsCaseSensitive = false;
// define the sort descriptor
PropertyValue[] aSortDesc = new PropertyValue[2];
aSortDesc[0] = new PropertyValue();
aSortDesc[0].Name = "SortFields";
aSortDesc[0].Value = aSortFields;
aSortDesc[1] = new PropertyValue();
aSortDesc[1].Name = "ContainsHeader";
aSortDesc[1].Value = new Boolean(true);
// perform the sorting
XSortable xSort = (XSortable) UnoRuntime.queryInterface(
XSortable.class, sourceRange);
xSort.sort(aSortDesc);
// Verify the sorting result
String[][] expectResult = { { "Level", "Code", "No.", "Team", "Name" },
{ "MS", "10", "1", "A", "Joker" },
{ "MS", "10", "3", "B", "Kevin" },
{ "BS", "20", "4", "B", "Elle" },
{ "BS", "20", "6", "C", "Sweet" },
{ "BS", "20", "2", "A", "Chcomic" },
{ "CS", "30", "5", "A", "Ally" },
{ "CS", "30", "7", "C", "Tom" } };
String[][] actureResult = SCUtil.getTextFromCellRange(currentsheet, 0,
0, 4, 7);
assertArrayEquals(expectResult, actureResult);
// Save and reload the document verify the sort result again
SCUtil.saveFileAs(scComponent, "SortSingleFiled", "ods");
XSpreadsheetDocument scDocumentTemp = SCUtil.reloadFile(unoApp,
scDocument, "SortSingleFiled.ods");
scDocument = scDocumentTemp;
currentsheet = SCUtil.getCurrentSheet(scDocument);
actureResult = SCUtil.getTextFromCellRange(currentsheet, 0, 0, 4, 7);
assertArrayEquals(expectResult, actureResult);
}
/**
* test sort with two fields
*/
@Test
public void sortByTwoFields() throws Exception {
scDocument = SCUtil.getSCDocument(scComponent);
XSpreadsheet currentsheet = SCUtil.getCurrentSheet(scDocument);
XCellRange sourceRange = currentsheet.getCellRangeByName("A1:E8");
XCellRangeData sourceData = (XCellRangeData) UnoRuntime.queryInterface(
XCellRangeData.class, sourceRange);
Object[][] Source = { { "Level", "Code", "No.", "Team", "Name" },
{ "BS", 20, 4, "B", "Elle" }, { "BS", 20, 6, "C", "Sweet" },
{ "BS", 20, 2, "A", "Chcomic" }, { "CS", 30, 5, "A", "Ally" },
{ "MS", 10, 1, "A", "Joker" }, { "MS", 10, 3, "B", "Kevin" },
{ "CS", 30, 7, "C", "Tom" } };
sourceData.setDataArray(Source);
// define the fields to sort
TableSortField[] aSortFields = new TableSortField[2];
aSortFields[0] = new TableSortField();
aSortFields[0].Field = 1;
aSortFields[0].IsAscending = true;
aSortFields[0].IsCaseSensitive = false;
aSortFields[1] = new TableSortField();
aSortFields[1].Field = 2;
aSortFields[1].IsAscending = false;
aSortFields[1].IsCaseSensitive = false;
// define the sort descriptor
PropertyValue[] aSortDesc = new PropertyValue[2];
aSortDesc[0] = new PropertyValue();
aSortDesc[0].Name = "SortFields";
aSortDesc[0].Value = aSortFields;
aSortDesc[1] = new PropertyValue();
aSortDesc[1].Name = "ContainsHeader";
aSortDesc[1].Value = new Boolean(true);
// perform the sorting
XSortable xSort = (XSortable) UnoRuntime.queryInterface(
XSortable.class, sourceRange);
xSort.sort(aSortDesc);
// Verify the sorting result
String[][] expectResult = { { "Level", "Code", "No.", "Team", "Name" },
{ "MS", "10", "3", "B", "Kevin" },
{ "MS", "10", "1", "A", "Joker" },
{ "BS", "20", "6", "C", "Sweet" },
{ "BS", "20", "4", "B", "Elle" },
{ "BS", "20", "2", "A", "Chcomic" },
{ "CS", "30", "7", "C", "Tom" },
{ "CS", "30", "5", "A", "Ally" } };
String[][] actureResult = SCUtil.getTextFromCellRange(currentsheet, 0,
0, 4, 7);
assertArrayEquals(expectResult, actureResult);
// Save and reload the document verify the sort result again
SCUtil.saveFileAs(scComponent, "SortTwoFileds", "xls");
XSpreadsheetDocument scDocumentTemp = SCUtil.reloadFile(unoApp,
scDocument, "SortTwoFileds.xls");
scDocument = scDocumentTemp;
currentsheet = SCUtil.getCurrentSheet(scDocument);
actureResult = SCUtil.getTextFromCellRange(currentsheet, 0, 0, 4, 7);
assertArrayEquals(expectResult, actureResult);
}
/**
* test sort with three fields
*/
@Test
public void sortByThreeField() throws Exception {
scDocument = SCUtil.getSCDocument(scComponent);
XSpreadsheet currentsheet = SCUtil.getCurrentSheet(scDocument);
XCellRange sourceRange = currentsheet.getCellRangeByName("A1:E8");
XCellRangeData sourceData = (XCellRangeData) UnoRuntime.queryInterface(
XCellRangeData.class, sourceRange);
Object[][] Source = { { "Level", "Code", "No.", "Team", "Name" },
{ "BS", 20, 4, "B", "Elle" }, { "MS", 20, 6, "C", "Sweet" },
{ "BS", 20, 2, "A", "Chcomic" }, { "CS", 30, 5, "A", "Ally" },
{ "MS", 10, 1, "A", "Joker" }, { "MS", 10, 3, "B", "Kevin" },
{ "CS", 30, 7, "C", "Tom" } };
sourceData.setDataArray(Source);
// --- sort by second column, ascending ---
// define the fields to sort
TableSortField[] aSortFields = new TableSortField[3];
aSortFields[0] = new TableSortField();
aSortFields[0].Field = 0;
aSortFields[0].IsAscending = true;
aSortFields[0].IsCaseSensitive = false;
aSortFields[1] = new TableSortField();
aSortFields[1].Field = 1;
aSortFields[1].IsAscending = false;
aSortFields[1].IsCaseSensitive = false;
aSortFields[2] = new TableSortField();
aSortFields[2].Field = 2;
aSortFields[2].IsAscending = false;
aSortFields[2].IsCaseSensitive = false;
// define the sort descriptor
PropertyValue[] aSortDesc = new PropertyValue[2];
aSortDesc[0] = new PropertyValue();
aSortDesc[0].Name = "SortFields";
aSortDesc[0].Value = aSortFields;
aSortDesc[1] = new PropertyValue();
aSortDesc[1].Name = "ContainsHeader";
aSortDesc[1].Value = new Boolean(true);
// perform the sorting
XSortable xSort = (XSortable) UnoRuntime.queryInterface(
XSortable.class, sourceRange);
xSort.sort(aSortDesc);
// Verify the sorting result
String[][] expectResult = { { "Level", "Code", "No.", "Team", "Name" },
{ "BS", "20", "4", "B", "Elle" },
{ "BS", "20", "2", "A", "Chcomic" },
{ "CS", "30", "7", "C", "Tom" },
{ "CS", "30", "5", "A", "Ally" },
{ "MS", "20", "6", "C", "Sweet" },
{ "MS", "10", "3", "B", "Kevin" },
{ "MS", "10", "1", "A", "Joker" } };
String[][] actureResult = SCUtil.getTextFromCellRange(currentsheet, 0,
0, 4, 7);
assertArrayEquals(expectResult, actureResult);
// Save and reload the document verify the sort result again
SCUtil.saveFileAs(scComponent, "SortThreeFileds", "ods");
XSpreadsheetDocument scDocumentTemp = SCUtil.reloadFile(unoApp,
scDocument, "SortThreeFileds.ods");
scDocument = scDocumentTemp;
currentsheet = SCUtil.getCurrentSheet(scDocument);
actureResult = SCUtil.getTextFromCellRange(currentsheet, 0, 0, 4, 7);
assertArrayEquals(expectResult, actureResult);
}
/**
* test sort options
*/
@Test
public void sortOption() throws Exception {
scDocument = SCUtil.getSCDocument(scComponent);
XSpreadsheet currentsheet = SCUtil.getCurrentSheet(scDocument);
XCellRange sourceRange = currentsheet.getCellRangeByName("A1:A8");
XCellRangeData sourceData = (XCellRangeData) UnoRuntime.queryInterface(
XCellRangeData.class, sourceRange);
Object[][] source = { { "Fri" }, { "Mon" }, { "Sun" }, { "Wed" },
{ "Thu" }, { "Sat" }, { "Tue" }, { "SUN" } };
sourceData.setDataArray(source);
XCell cell = currentsheet.getCellByPosition(1, 0);
XCellAddressable xCellAddr = (XCellAddressable) UnoRuntime
.queryInterface(XCellAddressable.class, cell);
CellAddress copytoAddress = xCellAddr.getCellAddress();
// define the fields to sort Sort by column 1and sort Ascending and not
// case sensitive
TableSortField[] aSortFields = new TableSortField[1];
aSortFields[0] = new TableSortField();
aSortFields[0].Field = 0;
aSortFields[0].IsAscending = true;
aSortFields[0].IsCaseSensitive = false;
// define the sort descriptor
// Range not contain label,Including formats,copy result to B1, and sort
// with custom sort order
PropertyValue[] aSortDesc = new PropertyValue[7];
aSortDesc[0] = new PropertyValue();
aSortDesc[0].Name = "SortFields";
aSortDesc[0].Value = aSortFields;
aSortDesc[1] = new PropertyValue();
aSortDesc[1].Name = "ContainsHeader";
aSortDesc[1].Value = new Boolean(false);
aSortDesc[2] = new PropertyValue();
aSortDesc[2].Name = "BindFormatsToContent";
aSortDesc[2].Value = new Boolean(true);
aSortDesc[3] = new PropertyValue();
aSortDesc[3].Name = "IsUserListEnabled";
aSortDesc[3].Value = new Boolean(true);
aSortDesc[4] = new PropertyValue();
aSortDesc[4].Name = "UserListIndex";
aSortDesc[4].Value = 0;
aSortDesc[5] = new PropertyValue();
aSortDesc[5].Name = "CopyOutputData";
aSortDesc[5].Value = new Boolean(true);
aSortDesc[6] = new PropertyValue();
aSortDesc[6].Name = "OutputPosition";
aSortDesc[6].Value = copytoAddress;
// perform the sorting
XSortable xSort = (XSortable) UnoRuntime.queryInterface(
XSortable.class, sourceRange);
xSort.sort(aSortDesc);
// Verify the sorting result
String[][] expectResult = { { "Sun" }, { "SUN" }, { "Mon" }, { "Tue" },
{ "Wed" }, { "Thu" }, { "Fri" }, { "Sat" } };
String[][] actureSortResult = SCUtil.getTextFromCellRange(currentsheet,
1, 0, 1, 7);
String[][] sourceAfterSort = SCUtil.getTextFromCellRange(currentsheet,
0, 0, 0, 7);
assertArrayEquals(source, sourceAfterSort);
assertArrayEquals(expectResult, actureSortResult);
// Save and reload the document verify the sort result again
SCUtil.saveFileAs(scComponent, "SortOption", "xls");
XSpreadsheetDocument scDocumentTemp = SCUtil.reloadFile(unoApp,
scDocument, "SortOption.xls");
scDocument = scDocumentTemp;
currentsheet = SCUtil.getCurrentSheet(scDocument);
actureSortResult = SCUtil
.getTextFromCellRange(currentsheet, 1, 0, 1, 7);
sourceAfterSort = SCUtil.getTextFromCellRange(currentsheet, 0, 0, 0, 7);
assertArrayEquals(source, sourceAfterSort);
assertArrayEquals(expectResult, actureSortResult);
}
}