Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

IndexTest.java 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. // Copyright (c) 2006 Health Market Science, Inc.
  2. package com.healthmarketscience.jackcess;
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.util.ArrayList;
  6. import java.util.Arrays;
  7. import java.util.HashMap;
  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.SortedSet;
  11. import java.util.TreeSet;
  12. import junit.framework.TestCase;
  13. import static com.healthmarketscience.jackcess.DatabaseTest.*;
  14. /**
  15. * @author James Ahlborn
  16. */
  17. public class IndexTest extends TestCase {
  18. /**
  19. * Creates a new <code>IndexTest</code> instance.
  20. *
  21. */
  22. public IndexTest(String name) {
  23. super(name);
  24. }
  25. public void testByteOrder() throws Exception {
  26. byte b1 = (byte)0x00;
  27. byte b2 = (byte)0x01;
  28. byte b3 = (byte)0x7F;
  29. byte b4 = (byte)0x80;
  30. byte b5 = (byte)0xFF;
  31. assertTrue(ByteUtil.toUnsignedInt(b1) < ByteUtil.toUnsignedInt(b2));
  32. assertTrue(ByteUtil.toUnsignedInt(b2) < ByteUtil.toUnsignedInt(b3));
  33. assertTrue(ByteUtil.toUnsignedInt(b3) < ByteUtil.toUnsignedInt(b4));
  34. assertTrue(ByteUtil.toUnsignedInt(b4) < ByteUtil.toUnsignedInt(b5));
  35. }
  36. public void testByteCodeComparator() {
  37. byte[] b0 = null;
  38. byte[] b1 = new byte[]{(byte)0x00};
  39. byte[] b2 = new byte[]{(byte)0x00, (byte)0x00};
  40. byte[] b3 = new byte[]{(byte)0x00, (byte)0x01};
  41. byte[] b4 = new byte[]{(byte)0x01};
  42. byte[] b5 = new byte[]{(byte)0x80};
  43. byte[] b6 = new byte[]{(byte)0xFF};
  44. byte[] b7 = new byte[]{(byte)0xFF, (byte)0x00};
  45. byte[] b8 = new byte[]{(byte)0xFF, (byte)0x01};
  46. List<byte[]> expectedList = Arrays.<byte[]>asList(b0, b1, b2, b3, b4,
  47. b5, b6, b7, b8);
  48. SortedSet<byte[]> sortedSet = new TreeSet<byte[]>(
  49. Index.BYTE_CODE_COMPARATOR);
  50. sortedSet.addAll(expectedList);
  51. assertEquals(expectedList, new ArrayList<byte[]>(sortedSet));
  52. }
  53. public void testPrimaryKey() throws Exception {
  54. Table table = open().getTable("Table1");
  55. Map<String, Boolean> foundPKs = new HashMap<String, Boolean>();
  56. for(Index index : table.getIndexes()) {
  57. foundPKs.put(index.getColumns().iterator().next().getName(),
  58. index.isPrimaryKey());
  59. }
  60. Map<String, Boolean> expectedPKs = new HashMap<String, Boolean>();
  61. expectedPKs.put("A", Boolean.TRUE);
  62. expectedPKs.put("B", Boolean.FALSE);
  63. assertEquals(expectedPKs, foundPKs);
  64. }
  65. public void testIndexSlots() throws Exception
  66. {
  67. Database mdb = Database.open(new File("test/data/indexTest.mdb"));
  68. Table table = mdb.getTable("Table1");
  69. assertEquals(4, table.getIndexes().size());
  70. assertEquals(4, table.getIndexSlotCount());
  71. table = mdb.getTable("Table2");
  72. assertEquals(2, table.getIndexes().size());
  73. assertEquals(3, table.getIndexSlotCount());
  74. table = mdb.getTable("Table3");
  75. assertEquals(2, table.getIndexes().size());
  76. assertEquals(3, table.getIndexSlotCount());
  77. }
  78. public void testComplexIndex() throws Exception
  79. {
  80. // this file has an index with "compressed" entries and node pages
  81. File origFile = new File("test/data/compIndexTest.mdb");
  82. Database db = Database.open(origFile);
  83. Table t = db.getTable("Table1");
  84. Index index = t.getIndexes().get(0);
  85. assertFalse(index.isInitialized());
  86. assertEquals(512, countRows(t));
  87. assertEquals(512, index.getEntryCount());
  88. db.close();
  89. // copy to temp file and attemp to edit
  90. File testFile = File.createTempFile("databaseTest", ".mdb");
  91. testFile.deleteOnExit();
  92. copyFile(origFile, testFile);
  93. db = Database.open(testFile);
  94. t = db.getTable("Table1");
  95. try {
  96. // we don't support writing these indexes
  97. t.addRow(99, "abc", "def");
  98. fail("Should have thrown IOException");
  99. } catch(UnsupportedOperationException e) {
  100. // success
  101. }
  102. }
  103. public void testEntryDeletion() throws Exception {
  104. File srcFile = new File("test/data/test.mdb");
  105. File dbFile = File.createTempFile("databaseTest", ".mdb");
  106. dbFile.deleteOnExit();
  107. copyFile(srcFile, dbFile);
  108. Table table = Database.open(dbFile).getTable("Table1");
  109. for(int i = 0; i < 10; ++i) {
  110. table.addRow("foo" + i, "bar" + i, (byte)42 + i, (short)53 + i, 13 * i,
  111. (6.7d / i), null, null, true);
  112. }
  113. table.reset();
  114. assertRowCount(12, table);
  115. for(Index index : table.getIndexes()) {
  116. assertEquals(12, index.getEntryCount());
  117. }
  118. table.reset();
  119. table.getNextRow();
  120. table.getNextRow();
  121. table.deleteCurrentRow();
  122. table.getNextRow();
  123. table.deleteCurrentRow();
  124. table.getNextRow();
  125. table.getNextRow();
  126. table.deleteCurrentRow();
  127. table.getNextRow();
  128. table.getNextRow();
  129. table.getNextRow();
  130. table.deleteCurrentRow();
  131. table.reset();
  132. assertRowCount(8, table);
  133. for(Index index : table.getIndexes()) {
  134. assertEquals(8, index.getEntryCount());
  135. }
  136. }
  137. }