|
|
@@ -0,0 +1,154 @@ |
|
|
|
/* |
|
|
|
Copyright (c) 2021 James Ahlborn |
|
|
|
|
|
|
|
Licensed 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 com.healthmarketscience.jackcess.impl; |
|
|
|
|
|
|
|
import java.time.LocalDate; |
|
|
|
import java.time.LocalDateTime; |
|
|
|
import java.time.format.DateTimeFormatter; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.Collections; |
|
|
|
import java.util.Comparator; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
|
|
|
|
import com.healthmarketscience.jackcess.Column; |
|
|
|
import com.healthmarketscience.jackcess.Cursor; |
|
|
|
import com.healthmarketscience.jackcess.DataType; |
|
|
|
import com.healthmarketscience.jackcess.Database; |
|
|
|
import static com.healthmarketscience.jackcess.DatabaseBuilder.*; |
|
|
|
import com.healthmarketscience.jackcess.Index; |
|
|
|
import com.healthmarketscience.jackcess.Row; |
|
|
|
import com.healthmarketscience.jackcess.Table; |
|
|
|
import static com.healthmarketscience.jackcess.TestUtil.*; |
|
|
|
import static com.healthmarketscience.jackcess.impl.JetFormatTest.*; |
|
|
|
import junit.framework.TestCase; |
|
|
|
import org.junit.Assert; |
|
|
|
|
|
|
|
/** |
|
|
|
* |
|
|
|
* @author James Ahlborn |
|
|
|
*/ |
|
|
|
public class ExtendedDateTest extends TestCase |
|
|
|
{ |
|
|
|
|
|
|
|
public ExtendedDateTest(String name) throws Exception { |
|
|
|
super(name); |
|
|
|
} |
|
|
|
|
|
|
|
public void testReadExtendedDate() throws Exception { |
|
|
|
|
|
|
|
DateTimeFormatter dtfNoTime = DateTimeFormatter.ofPattern("M/d/yyy"); |
|
|
|
DateTimeFormatter dtfFull = DateTimeFormatter.ofPattern("M/d/yyy h:mm:ss.SSSSSSS a"); |
|
|
|
|
|
|
|
for (final TestDB testDB : TestDB.getSupportedForBasename(Basename.EXT_DATE)) { |
|
|
|
|
|
|
|
Database db = openMem(testDB); |
|
|
|
|
|
|
|
Table t = db.getTable("Table1"); |
|
|
|
for(Row r : t) { |
|
|
|
LocalDateTime ldt = r.getLocalDateTime("DateExt"); |
|
|
|
String str = r.getString("DateExtStr"); |
|
|
|
|
|
|
|
if(ldt != null) { |
|
|
|
String str1 = dtfNoTime.format(ldt); |
|
|
|
String str2 = dtfFull.format(ldt); |
|
|
|
|
|
|
|
Assert.assertTrue(str1.equals(str) || str2.equals(str)); |
|
|
|
} else { |
|
|
|
Assert.assertNull(str); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
Index idx = t.getIndex("DateExtAsc"); |
|
|
|
IndexCodesTest.checkIndexEntries(testDB, t, idx); |
|
|
|
idx = t.getIndex("DateExtDesc"); |
|
|
|
IndexCodesTest.checkIndexEntries(testDB, t, idx); |
|
|
|
|
|
|
|
db.close(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public void testWriteExtendedDate() throws Exception { |
|
|
|
|
|
|
|
for (final Database.FileFormat fileFormat : SUPPORTED_FILEFORMATS) { |
|
|
|
JetFormat format = DatabaseImpl.getFileFormatDetails(fileFormat) |
|
|
|
.getFormat(); |
|
|
|
|
|
|
|
if(!format.isSupportedDataType(DataType.EXT_DATE_TIME)) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
Database db = create(fileFormat); |
|
|
|
|
|
|
|
Table t = newTable("Test") |
|
|
|
.addColumn(newColumn("id", DataType.LONG) |
|
|
|
.setAutoNumber(true)) |
|
|
|
.addColumn(newColumn("data1", DataType.TEXT)) |
|
|
|
.addColumn(newColumn("extDate", DataType.EXT_DATE_TIME)) |
|
|
|
.addIndex(newIndex("idxAsc").addColumns("extDate")) |
|
|
|
.addIndex(newIndex("idxDesc").addColumns(false, "extDate")) |
|
|
|
.toTable(db); |
|
|
|
|
|
|
|
Object[] ldts = { |
|
|
|
LocalDate.of(2020,6,17), |
|
|
|
LocalDate.of(2021,6,14), |
|
|
|
LocalDateTime.of(2021,6,14,12,45), |
|
|
|
LocalDateTime.of(2021,6,14,1,45), |
|
|
|
LocalDateTime.of(2021,6,14,22,45,12,345678900), |
|
|
|
LocalDateTime.of(1765,6,14,12,45), |
|
|
|
LocalDateTime.of(100,6,14,12,45,00,123456700), |
|
|
|
LocalDateTime.of(1265,6,14,12,45) |
|
|
|
}; |
|
|
|
|
|
|
|
List<Map<String, Object>> expectedTable = |
|
|
|
new ArrayList<Map<String, Object>>(); |
|
|
|
|
|
|
|
int idx = 1; |
|
|
|
for(Object ldt : ldts) { |
|
|
|
t.addRow(Column.AUTO_NUMBER, "" + ldt, ldt); |
|
|
|
|
|
|
|
LocalDateTime realLdt = (LocalDateTime)ColumnImpl.toInternalValue( |
|
|
|
DataType.EXT_DATE_TIME, ldt, (DatabaseImpl)db); |
|
|
|
|
|
|
|
expectedTable.add(createExpectedRow( |
|
|
|
"id", idx++, |
|
|
|
"data1", "" + ldt, |
|
|
|
"extDate", realLdt)); |
|
|
|
} |
|
|
|
|
|
|
|
Comparator<Map<String, Object>> comp = (r1, r2) -> { |
|
|
|
LocalDateTime l1 = (LocalDateTime)r1.get("extDate"); |
|
|
|
LocalDateTime l2 = (LocalDateTime)r2.get("extDate"); |
|
|
|
return l1.compareTo(l2); |
|
|
|
}; |
|
|
|
Collections.sort(expectedTable, comp); |
|
|
|
|
|
|
|
Cursor c = t.newCursor().setIndexByName("idxAsc").toIndexCursor(); |
|
|
|
|
|
|
|
assertCursor(expectedTable, c); |
|
|
|
|
|
|
|
Collections.sort(expectedTable, comp.reversed()); |
|
|
|
|
|
|
|
c = t.newCursor().setIndexByName("idxDesc").toIndexCursor(); |
|
|
|
|
|
|
|
assertCursor(expectedTable, c); |
|
|
|
|
|
|
|
db.close(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |