@Test
  public void testQuoteReservedWords() {
    DatabaseMeta databaseMeta = mock(DatabaseMeta.class);
    doCallRealMethod().when(databaseMeta).quoteReservedWords(any(RowMetaInterface.class));
    doCallRealMethod().when(databaseMeta).quoteField(anyString());
    doCallRealMethod().when(databaseMeta).setDatabaseInterface(any(DatabaseInterface.class));
    doReturn("\"").when(databaseMeta).getStartQuote();
    doReturn("\"").when(databaseMeta).getEndQuote();
    final DatabaseInterface databaseInterface = mock(DatabaseInterface.class);
    doReturn(true).when(databaseInterface).isQuoteAllFields();
    databaseMeta.setDatabaseInterface(databaseInterface);

    final RowMeta fields = new RowMeta();
    for (int i = 0; i < 10; i++) {
      final ValueMeta valueMeta = new ValueMeta("test_" + i);
      fields.addValueMeta(valueMeta);
    }

    for (int i = 0; i < 10; i++) {
      databaseMeta.quoteReservedWords(fields);
    }

    for (int i = 0; i < 10; i++) {
      databaseMeta.quoteReservedWords(fields);
      final String name = fields.getValueMeta(i).getName();
      // check valueMeta index in list
      assertTrue(name.contains("test_" + i));
      // check valueMeta is found by quoted name
      assertNotNull(fields.searchValueMeta(name));
    }
  }
  @Test
  public void testModifyingName() throws Exception {
    DatabaseMeta databaseMeta = mock(DatabaseMeta.class);
    OracleDatabaseMeta odbm = new OracleDatabaseMeta();
    doCallRealMethod().when(databaseMeta).setDatabaseInterface(any(DatabaseInterface.class));
    doCallRealMethod().when(databaseMeta).setName(anyString());
    doCallRealMethod().when(databaseMeta).getName();
    doCallRealMethod().when(databaseMeta).getDisplayName();
    databaseMeta.setDatabaseInterface(odbm);
    databaseMeta.setName("test");

    List<DatabaseMeta> list = new ArrayList<DatabaseMeta>();
    list.add(databaseMeta);

    DatabaseMeta databaseMeta2 = mock(DatabaseMeta.class);
    OracleDatabaseMeta odbm2 = new OracleDatabaseMeta();
    doCallRealMethod().when(databaseMeta2).setDatabaseInterface(any(DatabaseInterface.class));
    doCallRealMethod().when(databaseMeta2).setName(anyString());
    doCallRealMethod().when(databaseMeta2).getName();
    doCallRealMethod().when(databaseMeta2).setDisplayName(anyString());
    doCallRealMethod().when(databaseMeta2).getDisplayName();
    doCallRealMethod()
        .when(databaseMeta2)
        .verifyAndModifyDatabaseName(any(ArrayList.class), anyString());
    databaseMeta2.setDatabaseInterface(odbm2);
    databaseMeta2.setName("test");

    databaseMeta2.verifyAndModifyDatabaseName(list, null);

    assertTrue(!databaseMeta.getDisplayName().equals(databaseMeta2.getDisplayName()));
  }
 @Test
 public void testGetFeatureSummary() throws Exception {
   DatabaseMeta databaseMeta = mock(DatabaseMeta.class);
   OracleDatabaseMeta odbm = new OracleDatabaseMeta();
   doCallRealMethod().when(databaseMeta).setDatabaseInterface(any(DatabaseInterface.class));
   doCallRealMethod().when(databaseMeta).getFeatureSummary();
   doCallRealMethod().when(databaseMeta).getAttributes();
   databaseMeta.setDatabaseInterface(odbm);
   List<RowMetaAndData> result = databaseMeta.getFeatureSummary();
   assertNotNull(result);
   for (RowMetaAndData rmd : result) {
     assertEquals(2, rmd.getRowMeta().size());
     assertEquals("Parameter", rmd.getRowMeta().getValueMeta(0).getName());
     assertEquals(ValueMetaInterface.TYPE_STRING, rmd.getRowMeta().getValueMeta(0).getType());
     assertEquals("Value", rmd.getRowMeta().getValueMeta(1).getName());
     assertEquals(ValueMetaInterface.TYPE_STRING, rmd.getRowMeta().getValueMeta(1).getType());
   }
 }
  @Test
  public void testApplyingDefaultOptions() throws Exception {
    HashMap<String, String> existingOptions = new HashMap<String, String>();
    existingOptions.put("type1.extra", "extraValue");
    existingOptions.put("type1.existing", "existingValue");
    existingOptions.put("type2.extra", "extraValue2");

    HashMap<String, String> newOptions = new HashMap<String, String>();
    newOptions.put("type1.new", "newValue");
    newOptions.put("type1.existing", "existingDefault");

    // Register Natives to create a default DatabaseMeta
    DatabasePluginType.getInstance().searchPlugins();
    DatabaseMeta meta = new DatabaseMeta();
    DatabaseInterface type = mock(DatabaseInterface.class);
    meta.setDatabaseInterface(type);

    when(type.getExtraOptions()).thenReturn(existingOptions);
    when(type.getDefaultOptions()).thenReturn(newOptions);

    meta.applyDefaultOptions(type);
    verify(type).addExtraOption("type1", "new", "newValue");
    verify(type, never()).addExtraOption("type1", "existing", "existingDefault");
  }
 @Test
 public void testDatabaseAccessTypeCode() throws Exception {
   String expectedJndi = "JNDI";
   String access = DatabaseMeta.getAccessTypeDesc(DatabaseMeta.getAccessType(expectedJndi));
   assertEquals(expectedJndi, access);
 }