| /* ==================================================================== |
| 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.ss.format; |
| |
| import static org.junit.Assert.assertEquals; |
| |
| import java.util.Locale; |
| import java.util.TimeZone; |
| import java.util.regex.Matcher; |
| import java.util.regex.Pattern; |
| |
| import org.apache.poi.ss.usermodel.Cell; |
| import org.apache.poi.util.LocaleUtil; |
| import org.apache.poi.xssf.XSSFITestDataProvider; |
| import org.junit.AfterClass; |
| import org.junit.BeforeClass; |
| import org.junit.Test; |
| |
| /** Test the individual CellFormatPart types. */ |
| public class TestCellFormatPart extends CellFormatTestBase { |
| |
| private static Locale userLocale; |
| |
| @BeforeClass |
| public static void setLocale() { |
| userLocale = LocaleUtil.getUserLocale(); |
| LocaleUtil.setUserLocale(Locale.ROOT); |
| } |
| |
| @AfterClass |
| public static void unsetLocale() { |
| LocaleUtil.setUserLocale(userLocale); |
| } |
| |
| private static final Pattern NUMBER_EXTRACT_FMT = Pattern.compile( |
| "([-+]?[0-9]+)(\\.[0-9]+)?.*(?:(e).*?([+-]?[0-9]+))", |
| Pattern.CASE_INSENSITIVE); |
| |
| public TestCellFormatPart() { |
| super(XSSFITestDataProvider.instance); |
| } |
| |
| @Test |
| public void testGeneralFormat() throws Exception { |
| runFormatTests("GeneralFormatTests.xlsx", new CellValue() { |
| @Override |
| public Object getValue(Cell cell) { |
| switch (CellFormat.ultimateTypeEnum(cell)) { |
| case BOOLEAN: |
| return cell.getBooleanCellValue(); |
| case NUMERIC: |
| return cell.getNumericCellValue(); |
| default: |
| return cell.getStringCellValue(); |
| } |
| } |
| }); |
| } |
| |
| public void testNumberFormat() throws Exception { |
| runFormatTests("NumberFormatTests.xlsx", new CellValue() { |
| @Override |
| public Object getValue(Cell cell) { |
| return cell.getNumericCellValue(); |
| } |
| }); |
| } |
| |
| @Test |
| public void testNumberApproxFormat() throws Exception { |
| runFormatTests("NumberFormatApproxTests.xlsx", new CellValue() { |
| @Override |
| public Object getValue(Cell cell) { |
| return cell.getNumericCellValue(); |
| } |
| |
| @Override |
| void equivalent(String expected, String actual, |
| CellFormatPart format) { |
| double expectedVal = extractNumber(expected); |
| double actualVal = extractNumber(actual); |
| // equal within 1% |
| double delta = expectedVal / 100; |
| assertEquals("format \"" + format + "\"," + expected + " ~= " + |
| actual, expectedVal, actualVal, delta); |
| } |
| }); |
| } |
| |
| @Test |
| public void testDateFormat() throws Exception { |
| TimeZone tz = LocaleUtil.getUserTimeZone(); |
| LocaleUtil.setUserTimeZone(TimeZone.getTimeZone("CET")); |
| try { |
| runFormatTests("DateFormatTests.xlsx", new CellValue() { |
| @Override |
| public Object getValue(Cell cell) { |
| return cell.getDateCellValue(); |
| } |
| }); |
| } finally { |
| LocaleUtil.setUserTimeZone(tz); |
| } |
| } |
| |
| @Test |
| public void testElapsedFormat() throws Exception { |
| runFormatTests("ElapsedFormatTests.xlsx", new CellValue() { |
| @Override |
| public Object getValue(Cell cell) { |
| return cell.getNumericCellValue(); |
| } |
| }); |
| } |
| |
| @Test |
| public void testTextFormat() throws Exception { |
| runFormatTests("TextFormatTests.xlsx", new CellValue() { |
| @Override |
| public Object getValue(Cell cell) { |
| switch(CellFormat.ultimateTypeEnum(cell)) { |
| case BOOLEAN: |
| return cell.getBooleanCellValue(); |
| default: |
| return cell.getStringCellValue(); |
| } |
| } |
| }); |
| } |
| |
| @Test |
| public void testConditions() throws Exception { |
| runFormatTests("FormatConditionTests.xlsx", new CellValue() { |
| @Override |
| Object getValue(Cell cell) { |
| return cell.getNumericCellValue(); |
| } |
| }); |
| } |
| |
| private double extractNumber(String str) { |
| Matcher m = NUMBER_EXTRACT_FMT.matcher(str); |
| if (!m.find()) |
| throw new IllegalArgumentException( |
| "Cannot find numer in \"" + str + "\""); |
| |
| StringBuffer sb = new StringBuffer(); |
| // The groups in the pattern are the parts of the number |
| for (int i = 1; i <= m.groupCount(); i++) { |
| String part = m.group(i); |
| if (part != null) |
| sb.append(part); |
| } |
| return Double.valueOf(sb.toString()); |
| } |
| } |