From cb3b8085ccf3b3c2a52a4d431b2a3befd98c1ef2 Mon Sep 17 00:00:00 2001 From: James Ahlborn Date: Wed, 26 Oct 2011 02:57:23 +0000 Subject: [PATCH] add 2007 complex test db git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@581 f203690c-595d-4dc9-a70b-905162fa7fd2 --- test/data/V2007/complexDataTestV2007.accdb | Bin 0 -> 524288 bytes .../jackcess/ComplexColumnTest.java | 344 +++++++++--------- .../jackcess/JetFormatTest.java | 3 +- 3 files changed, 179 insertions(+), 168 deletions(-) create mode 100755 test/data/V2007/complexDataTestV2007.accdb diff --git a/test/data/V2007/complexDataTestV2007.accdb b/test/data/V2007/complexDataTestV2007.accdb new file mode 100755 index 0000000000000000000000000000000000000000..3f9ff364cae15aa4e9ded880e456635f3728ac45 GIT binary patch literal 524288 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 literal 0 HcmV?d00001 diff --git a/test/src/java/com/healthmarketscience/jackcess/ComplexColumnTest.java b/test/src/java/com/healthmarketscience/jackcess/ComplexColumnTest.java index d853f6f..a0664c4 100644 --- a/test/src/java/com/healthmarketscience/jackcess/ComplexColumnTest.java +++ b/test/src/java/com/healthmarketscience/jackcess/ComplexColumnTest.java @@ -8,6 +8,7 @@ import java.util.Date; import java.util.List; import java.util.Map; +import static com.healthmarketscience.jackcess.JetFormatTest.*; import static com.healthmarketscience.jackcess.DatabaseTest.*; import com.healthmarketscience.jackcess.complex.Attachment; import com.healthmarketscience.jackcess.complex.ComplexDataType; @@ -30,189 +31,198 @@ public class ComplexColumnTest extends TestCase public void testVersions() throws Exception { - Database db = DatabaseTest.openCopy(Database.FileFormat.V2007, new File("/data2/jackcess_test/complexDataTest.accdb")); - db.setTimeZone(TEST_TZ); - - Table t1 = db.getTable("Table1"); - Column col = t1.getColumn("append-memo-data"); - assertTrue(col.isAppendOnly()); - Column verCol = col.getVersionHistoryColumn(); - assertNotNull(verCol); - assertEquals(ComplexDataType.VERSION_HISTORY, - verCol.getComplexInfo().getType()); - - for(Map row : t1) { - String rowId = (String)row.get("id"); - ComplexValueForeignKey complexValueFk = - (ComplexValueForeignKey)verCol.getRowValue(row); - - String curValue = (String)col.getRowValue(row); + for(final TestDB testDB : TestDB.getSupportedForBasename(Basename.COMPLEX)) { - if(rowId.equals("row1")) { - checkVersions(1, complexValueFk, curValue); - } else if(rowId.equals("row2")) { - checkVersions(2, complexValueFk, curValue, - "row2-memo", new Date(1315876862334L)); - } else if(rowId.equals("row3")) { - checkVersions(3, complexValueFk, curValue, - "row3-memo-again", new Date(1315876965382L), - "row3-memo-revised", new Date(1315876953077L), - "row3-memo", new Date(1315876879126L)); - } else if(rowId.equals("row4")) { - checkVersions(4, complexValueFk, curValue, - "row4-memo", new Date(1315876945758L)); - } else { - assertTrue(false); + Database db = openCopy(testDB); + db.setTimeZone(TEST_TZ); + + Table t1 = db.getTable("Table1"); + Column col = t1.getColumn("append-memo-data"); + assertTrue(col.isAppendOnly()); + Column verCol = col.getVersionHistoryColumn(); + assertNotNull(verCol); + assertEquals(ComplexDataType.VERSION_HISTORY, + verCol.getComplexInfo().getType()); + + for(Map row : t1) { + String rowId = (String)row.get("id"); + ComplexValueForeignKey complexValueFk = + (ComplexValueForeignKey)verCol.getRowValue(row); + + String curValue = (String)col.getRowValue(row); + + if(rowId.equals("row1")) { + checkVersions(1, complexValueFk, curValue); + } else if(rowId.equals("row2")) { + checkVersions(2, complexValueFk, curValue, + "row2-memo", new Date(1315876862334L)); + } else if(rowId.equals("row3")) { + checkVersions(3, complexValueFk, curValue, + "row3-memo-again", new Date(1315876965382L), + "row3-memo-revised", new Date(1315876953077L), + "row3-memo", new Date(1315876879126L)); + } else if(rowId.equals("row4")) { + checkVersions(4, complexValueFk, curValue, + "row4-memo", new Date(1315876945758L)); + } else { + assertTrue(false); + } } - } - Object[] row8 = {"row8", Column.AUTO_NUMBER, "some-data", "row8-memo", - Column.AUTO_NUMBER, Column.AUTO_NUMBER}; - t1.addRow(row8); - - ComplexValueForeignKey row8ValFk = (ComplexValueForeignKey) - verCol.getRowValue(row8); - Date upTime = new Date(); - row8ValFk.addVersion("row8-memo", upTime); - checkVersions(8, row8ValFk, "row8-memo", - "row8-memo", upTime); - - Cursor cursor = Cursor.createCursor(t1); - assertTrue(cursor.findRow(t1.getColumn("id"), "row3")); - ComplexValueForeignKey row3ValFk = (ComplexValueForeignKey) - cursor.getCurrentRowValue(verCol); - cursor.setCurrentRowValue(col, "new-value"); - Version v = row3ValFk.addVersion("new-value", upTime); - checkVersions(3, row3ValFk, "new-value", - "new-value", upTime, - "row3-memo-again", new Date(1315876965382L), - "row3-memo-revised", new Date(1315876953077L), - "row3-memo", new Date(1315876879126L)); - - try { - v.update(); - fail("UnsupportedOperationException should have been thrown"); - } catch(UnsupportedOperationException expected) { - // success - } + Object[] row8 = {"row8", Column.AUTO_NUMBER, "some-data", "row8-memo", + Column.AUTO_NUMBER, Column.AUTO_NUMBER}; + t1.addRow(row8); + + ComplexValueForeignKey row8ValFk = (ComplexValueForeignKey) + verCol.getRowValue(row8); + Date upTime = new Date(); + row8ValFk.addVersion("row8-memo", upTime); + checkVersions(8, row8ValFk, "row8-memo", + "row8-memo", upTime); + + Cursor cursor = Cursor.createCursor(t1); + assertTrue(cursor.findRow(t1.getColumn("id"), "row3")); + ComplexValueForeignKey row3ValFk = (ComplexValueForeignKey) + cursor.getCurrentRowValue(verCol); + cursor.setCurrentRowValue(col, "new-value"); + Version v = row3ValFk.addVersion("new-value", upTime); + checkVersions(3, row3ValFk, "new-value", + "new-value", upTime, + "row3-memo-again", new Date(1315876965382L), + "row3-memo-revised", new Date(1315876953077L), + "row3-memo", new Date(1315876879126L)); + + try { + v.update(); + fail("UnsupportedOperationException should have been thrown"); + } catch(UnsupportedOperationException expected) { + // success + } - db.close(); + db.close(); + } } public void testAttachments() throws Exception { - Database db = DatabaseTest.openCopy(Database.FileFormat.V2007, new File("/data2/jackcess_test/complexDataTest.accdb")); - db.setTimeZone(TEST_TZ); - - Table t1 = db.getTable("Table1"); - Column col = t1.getColumn("attach-data"); - assertEquals(ComplexDataType.ATTACHMENT, - col.getComplexInfo().getType()); - - for(Map row : t1) { - String rowId = (String)row.get("id"); - ComplexValueForeignKey complexValueFk = - (ComplexValueForeignKey)col.getRowValue(row); - - if(rowId.equals("row1")) { - checkAttachments(1, complexValueFk); - } else if(rowId.equals("row2")) { - checkAttachments(2, complexValueFk, "test_data.txt", "test_data2.txt"); - } else if(rowId.equals("row3")) { - checkAttachments(3, complexValueFk); - } else if(rowId.equals("row4")) { - checkAttachments(4, complexValueFk, "test_data2.txt"); - } else { - assertTrue(false); + for(final TestDB testDB : TestDB.getSupportedForBasename(Basename.COMPLEX)) { + + Database db = openCopy(testDB); + db.setTimeZone(TEST_TZ); + + Table t1 = db.getTable("Table1"); + Column col = t1.getColumn("attach-data"); + assertEquals(ComplexDataType.ATTACHMENT, + col.getComplexInfo().getType()); + + for(Map row : t1) { + String rowId = (String)row.get("id"); + ComplexValueForeignKey complexValueFk = + (ComplexValueForeignKey)col.getRowValue(row); + + if(rowId.equals("row1")) { + checkAttachments(1, complexValueFk); + } else if(rowId.equals("row2")) { + checkAttachments(2, complexValueFk, "test_data.txt", "test_data2.txt"); + } else if(rowId.equals("row3")) { + checkAttachments(3, complexValueFk); + } else if(rowId.equals("row4")) { + checkAttachments(4, complexValueFk, "test_data2.txt"); + } else { + assertTrue(false); + } } - } - Object[] row8 = {"row8", Column.AUTO_NUMBER, "some-data", "row8-memo", - Column.AUTO_NUMBER, Column.AUTO_NUMBER}; - t1.addRow(row8); - - ComplexValueForeignKey row8ValFk = (ComplexValueForeignKey) - col.getRowValue(row8); - row8ValFk.addAttachment(null, "test_data.txt", "txt", - getFileBytes("test_data.txt"), null, null); - checkAttachments(8, row8ValFk, "test_data.txt"); - - Cursor cursor = Cursor.createCursor(t1); - assertTrue(cursor.findRow(t1.getColumn("id"), "row4")); - ComplexValueForeignKey row4ValFk = (ComplexValueForeignKey) - cursor.getCurrentRowValue(col); - Attachment a = row4ValFk.addAttachment(null, "test_data.txt", "txt", - getFileBytes("test_data.txt"), null, - null); - checkAttachments(4, row4ValFk, "test_data2.txt", "test_data.txt"); - - a.setFileType("xml"); - a.setFileName("some_data.xml"); - byte[] newBytes = "this is not xml".getBytes("US-ASCII"); - a.setFileData(newBytes); - a.update(); - - Attachment updated = row4ValFk.getAttachments().get(1); - assertNotSame(updated, a); - assertEquals("xml", updated.getFileType()); - assertEquals("some_data.xml", updated.getFileName()); - assertTrue(Arrays.equals(newBytes, updated.getFileData())); + Object[] row8 = {"row8", Column.AUTO_NUMBER, "some-data", "row8-memo", + Column.AUTO_NUMBER, Column.AUTO_NUMBER}; + t1.addRow(row8); + + ComplexValueForeignKey row8ValFk = (ComplexValueForeignKey) + col.getRowValue(row8); + row8ValFk.addAttachment(null, "test_data.txt", "txt", + getFileBytes("test_data.txt"), null, null); + checkAttachments(8, row8ValFk, "test_data.txt"); + + Cursor cursor = Cursor.createCursor(t1); + assertTrue(cursor.findRow(t1.getColumn("id"), "row4")); + ComplexValueForeignKey row4ValFk = (ComplexValueForeignKey) + cursor.getCurrentRowValue(col); + Attachment a = row4ValFk.addAttachment(null, "test_data.txt", "txt", + getFileBytes("test_data.txt"), null, + null); + checkAttachments(4, row4ValFk, "test_data2.txt", "test_data.txt"); + + a.setFileType("xml"); + a.setFileName("some_data.xml"); + byte[] newBytes = "this is not xml".getBytes("US-ASCII"); + a.setFileData(newBytes); + a.update(); + + Attachment updated = row4ValFk.getAttachments().get(1); + assertNotSame(updated, a); + assertEquals("xml", updated.getFileType()); + assertEquals("some_data.xml", updated.getFileName()); + assertTrue(Arrays.equals(newBytes, updated.getFileData())); - db.close(); + db.close(); + } } public void testMultiValues() throws Exception { - Database db = DatabaseTest.openCopy(Database.FileFormat.V2007, new File("/data2/jackcess_test/complexDataTest.accdb")); - db.setTimeZone(TEST_TZ); - - Table t1 = db.getTable("Table1"); - Column col = t1.getColumn("multi-value-data"); - assertEquals(ComplexDataType.MULTI_VALUE, - col.getComplexInfo().getType()); - - for(Map row : t1) { - String rowId = (String)row.get("id"); - ComplexValueForeignKey complexValueFk = - (ComplexValueForeignKey)col.getRowValue(row); - - if(rowId.equals("row1")) { - checkMultiValues(1, complexValueFk); - } else if(rowId.equals("row2")) { - checkMultiValues(2, complexValueFk, "value1", "value4"); - } else if(rowId.equals("row3")) { - checkMultiValues(3, complexValueFk, - "value1", "value2", "value3", "value4"); - } else if(rowId.equals("row4")) { - checkMultiValues(4, complexValueFk); - } else { - assertTrue(false); - } - } - - Object[] row8 = {"row8", Column.AUTO_NUMBER, "some-data", "row8-memo", - Column.AUTO_NUMBER, Column.AUTO_NUMBER}; - t1.addRow(row8); - - ComplexValueForeignKey row8ValFk = (ComplexValueForeignKey) - col.getRowValue(row8); - row8ValFk.addMultiValue("value1"); - row8ValFk.addMultiValue("value2"); - checkMultiValues(8, row8ValFk, "value1", "value2"); - - Cursor cursor = Cursor.createCursor(t1); - assertTrue(cursor.findRow(t1.getColumn("id"), "row2")); - ComplexValueForeignKey row2ValFk = (ComplexValueForeignKey) - cursor.getCurrentRowValue(col); - SingleValue v = row2ValFk.addMultiValue("value2"); - row2ValFk.addMultiValue("value3"); - checkMultiValues(2, row2ValFk, "value1", "value4", "value2", "value3"); - - v.set("value5"); - v.update(); - checkMultiValues(2, row2ValFk, "value1", "value4", "value5", "value3"); + for(final TestDB testDB : TestDB.getSupportedForBasename(Basename.COMPLEX)) { + + Database db = openCopy(testDB); + db.setTimeZone(TEST_TZ); + + Table t1 = db.getTable("Table1"); + Column col = t1.getColumn("multi-value-data"); + assertEquals(ComplexDataType.MULTI_VALUE, + col.getComplexInfo().getType()); + + for(Map row : t1) { + String rowId = (String)row.get("id"); + ComplexValueForeignKey complexValueFk = + (ComplexValueForeignKey)col.getRowValue(row); + + if(rowId.equals("row1")) { + checkMultiValues(1, complexValueFk); + } else if(rowId.equals("row2")) { + checkMultiValues(2, complexValueFk, "value1", "value4"); + } else if(rowId.equals("row3")) { + checkMultiValues(3, complexValueFk, + "value1", "value2", "value3", "value4"); + } else if(rowId.equals("row4")) { + checkMultiValues(4, complexValueFk); + } else { + assertTrue(false); + } + } + + Object[] row8 = {"row8", Column.AUTO_NUMBER, "some-data", "row8-memo", + Column.AUTO_NUMBER, Column.AUTO_NUMBER}; + t1.addRow(row8); + + ComplexValueForeignKey row8ValFk = (ComplexValueForeignKey) + col.getRowValue(row8); + row8ValFk.addMultiValue("value1"); + row8ValFk.addMultiValue("value2"); + checkMultiValues(8, row8ValFk, "value1", "value2"); + + Cursor cursor = Cursor.createCursor(t1); + assertTrue(cursor.findRow(t1.getColumn("id"), "row2")); + ComplexValueForeignKey row2ValFk = (ComplexValueForeignKey) + cursor.getCurrentRowValue(col); + SingleValue v = row2ValFk.addMultiValue("value2"); + row2ValFk.addMultiValue("value3"); + checkMultiValues(2, row2ValFk, "value1", "value4", "value2", "value3"); + + v.set("value5"); + v.update(); + checkMultiValues(2, row2ValFk, "value1", "value4", "value5", "value3"); - db.close(); + db.close(); + } } private static void checkVersions( diff --git a/test/src/java/com/healthmarketscience/jackcess/JetFormatTest.java b/test/src/java/com/healthmarketscience/jackcess/JetFormatTest.java index e60bf96..22dff2d 100644 --- a/test/src/java/com/healthmarketscience/jackcess/JetFormatTest.java +++ b/test/src/java/com/healthmarketscience/jackcess/JetFormatTest.java @@ -41,7 +41,8 @@ public class JetFormatTest extends TestCase { TEST2("test2"), INDEX_CODES("testIndexCodes"), INDEX_PROPERTIES("testIndexProperties"), - PROMOTION("testPromotion"); + PROMOTION("testPromotion"), + COMPLEX("complexDataTest"); private final String _basename; -- 2.39.5