aboutsummaryrefslogtreecommitdiffstats
path: root/test/src/java/com/healthmarketscience/jackcess/ComplexColumnTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'test/src/java/com/healthmarketscience/jackcess/ComplexColumnTest.java')
-rw-r--r--test/src/java/com/healthmarketscience/jackcess/ComplexColumnTest.java309
1 files changed, 309 insertions, 0 deletions
diff --git a/test/src/java/com/healthmarketscience/jackcess/ComplexColumnTest.java b/test/src/java/com/healthmarketscience/jackcess/ComplexColumnTest.java
new file mode 100644
index 0000000..d853f6f
--- /dev/null
+++ b/test/src/java/com/healthmarketscience/jackcess/ComplexColumnTest.java
@@ -0,0 +1,309 @@
+// Copyright (c) 2011 Boomi, Inc.
+
+package com.healthmarketscience.jackcess;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import static com.healthmarketscience.jackcess.DatabaseTest.*;
+import com.healthmarketscience.jackcess.complex.Attachment;
+import com.healthmarketscience.jackcess.complex.ComplexDataType;
+import com.healthmarketscience.jackcess.complex.ComplexValueForeignKey;
+import com.healthmarketscience.jackcess.complex.SingleValue;
+import com.healthmarketscience.jackcess.complex.Version;
+import junit.framework.TestCase;
+
+
+/**
+ *
+ * @author James Ahlborn
+ */
+public class ComplexColumnTest extends TestCase
+{
+
+ public ComplexColumnTest(String name) {
+ super(name);
+ }
+
+ 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<String,Object> 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
+ }
+
+ 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<String,Object> 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()));
+
+ 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<String,Object> 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();
+ }
+
+ private static void checkVersions(
+ int cValId, ComplexValueForeignKey complexValueFk,
+ String curValue, Object... versionInfos)
+ throws Exception
+ {
+ assertEquals(cValId, complexValueFk.get());
+
+ List<Version> versions = complexValueFk.getVersions();
+ if(versionInfos.length == 0) {
+ assertTrue(versions.isEmpty());
+ assertNull(curValue);
+ } else {
+ assertEquals(versionInfos.length / 2, versions.size());
+ assertEquals(curValue, versions.get(0).getValue());
+ for(int i = 0; i < versionInfos.length; i+=2) {
+ String value = (String)versionInfos[i];
+ Date modDate = (Date)versionInfos[i+1];
+ Version v = versions.get(i/2);
+ assertEquals(value, v.getValue());
+ assertSameDate(modDate, v.getModifiedDate());
+ }
+ }
+ }
+
+ private static void checkAttachments(
+ int cValId, ComplexValueForeignKey complexValueFk,
+ String... fileNames)
+ throws Exception
+ {
+ assertEquals(cValId, complexValueFk.get());
+
+ List<Attachment> attachments = complexValueFk.getAttachments();
+ if(fileNames.length == 0) {
+ assertTrue(attachments.isEmpty());
+ } else {
+ assertEquals(fileNames.length, attachments.size());
+ for(int i = 0; i < fileNames.length; ++i) {
+ String fname = fileNames[i];
+ byte[] dataBytes = getFileBytes(fname);
+ Attachment a = attachments.get(i);
+ assertEquals(fname, a.getFileName());
+ assertEquals("txt", a.getFileType());
+ assertTrue(Arrays.equals(dataBytes, a.getFileData()));
+ }
+ }
+ }
+
+ private static void checkMultiValues(
+ int cValId, ComplexValueForeignKey complexValueFk,
+ Object... expectedValues)
+ throws Exception
+ {
+ assertEquals(cValId, complexValueFk.get());
+
+ List<SingleValue> values = complexValueFk.getMultiValues();
+ if(expectedValues.length == 0) {
+ assertTrue(values.isEmpty());
+ } else {
+ assertEquals(expectedValues.length, values.size());
+ for(int i = 0; i < expectedValues.length; ++i) {
+ Object value = expectedValues[i];
+ SingleValue v = values.get(i);
+ assertEquals(value, v.get());
+ }
+ }
+ }
+
+ private static byte[] getFileBytes(String fname) throws Exception
+ {
+ if("test_data.txt".equals(fname)) {
+ return TEST_BYTES;
+ }
+ if("test_data2.txt".equals(fname)) {
+ return TEST2_BYTES;
+ }
+ throw new RuntimeException("unexpected bytes");
+ }
+
+ private static byte b(int i) { return (byte)i; }
+
+ private static final byte[] TEST_BYTES = new byte[] {
+ b(0x01),b(0x00),b(0x00),b(0x00),b(0x3A),b(0x00),b(0x00),b(0x00),b(0x78),b(0x5E),b(0x13),b(0x61),b(0x60),b(0x60),b(0x60),b(0x04),b(0x62),b(0x16),b(0x20),b(0x2E),b(0x61),b(0xA8),b(0x00),b(0x62),
+ b(0x20),b(0x9D),b(0x91),b(0x59),b(0xAC),b(0x00),b(0x44),b(0xC5),b(0xF9),b(0xB9),b(0xA9),b(0x0A),b(0x25),b(0xA9),b(0xC5),b(0x25),b(0x0A),b(0x29),b(0x89),b(0x25),b(0x89),b(0x0A),b(0x69),b(0xF9),
+ b(0x45),b(0x0A),b(0x89),b(0x25),b(0x25),b(0x89),b(0xC9),b(0x19),b(0xB9),b(0xA9),b(0x79),b(0x25),b(0x7A),b(0x00),b(0x52),b(0xA9),b(0x0F),b(0x7A)
+ };
+
+ private static final byte[] TEST2_BYTES = new byte[] {
+ b(0x01),b(0x00),b(0x00),b(0x00),b(0x3F),b(0x00),b(0x00),b(0x00),b(0x78),b(0x5E),b(0x13),b(0x61),b(0x60),b(0x60),b(0x60),b(0x04),b(0x62),b(0x16),b(0x20),b(0x2E),b(0x61),b(0xA8),b(0x00),b(0x62),
+ b(0x20),b(0x9D),b(0x91),b(0x59),b(0xAC),b(0x00),b(0x44),b(0xC5),b(0xF9),b(0xB9),b(0xA9),b(0x0A),b(0xB9),b(0xF9),b(0x45),b(0xA9),b(0x0A),b(0x25),b(0xA9),b(0xC5),b(0x25),b(0x0A),b(0x29),b(0x89),
+ b(0x25),b(0x89),b(0x0A),b(0x69),b(0xF9),b(0x45),b(0x0A),b(0x89),b(0x25),b(0x25),b(0x89),b(0xC9),b(0x19),b(0xB9),b(0xA9),b(0x79),b(0x25),b(0x7A),b(0x00),b(0xA5),b(0x0B),b(0x11),b(0x4D)
+ };
+}