/*
* Copyright 2014 NAVER Corp.
*
* 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.navercorp.pinpoint.common.util;
import static org.mockito.Mockito.*;
import org.junit.Assert;
import org.junit.Test;
import java.util.*;
public class DelegateEnumerationTest {
@Test
public void testNormal() throws Exception {
Hashtable<String, String> hashTable = new Hashtable<String, String>();
hashTable.put("a", "aa");
hashTable.put("b", "bb");
hashTable.put("c", "cc");
List<String> valueList = new ArrayList<String>(hashTable.values());
Enumeration<String> enumeration = hashTable.elements();
DelegateEnumeration<String> delegateEnumeration = new DelegateEnumeration<String>(enumeration);
Assert.assertTrue(delegateEnumeration.hasMoreElements());
Assert.assertTrue(valueList.remove(delegateEnumeration.nextElement()));
Assert.assertTrue(delegateEnumeration.hasMoreElements());
Assert.assertTrue(valueList.remove(delegateEnumeration.nextElement()));
Assert.assertTrue(delegateEnumeration.hasMoreElements());
Assert.assertTrue(valueList.remove(delegateEnumeration.nextElement()));
Assert.assertTrue(valueList.isEmpty());
Assert.assertFalse(delegateEnumeration.hasMoreElements());
Assert.assertNull(delegateEnumeration._getNextException());
assertNextElements_Expected_ExceptionEmulation(enumeration, delegateEnumeration);
}
@Test
public void bug69_Inefficient_exception_is_created() throws Exception {
Hashtable<String, String> hashTable = new Hashtable<String, String>();
Enumeration<String> enumeration = hashTable.elements();
DelegateEnumeration<String> delegateEnumeration = new DelegateEnumeration<String>(enumeration);
Assert.assertFalse(delegateEnumeration.hasMoreElements());
Assert.assertNull(delegateEnumeration._getNextException());
assertNextElements_Expected_ExceptionEmulation(enumeration, delegateEnumeration);
}
@Test
public void bug69_Inefficient_exception_is_created_nextElement() throws Exception {
Enumeration<String> enumeration = mock(Enumeration.class);
when(enumeration.hasMoreElements()).thenReturn(true);
when(enumeration.nextElement()).thenReturn(null);
DelegateEnumeration<String> delegateEnumeration = new DelegateEnumeration<String>(enumeration);
Assert.assertNull(delegateEnumeration.nextElement());
verify(enumeration, times(1)).nextElement();
Assert.assertNull(delegateEnumeration.nextElement());
verify(enumeration, times(2)).nextElement();
Assert.assertNull(delegateEnumeration.nextElement());
verify(enumeration, times(3)).nextElement();
}
@Test
public void testSkip() throws Exception {
Hashtable<String, String> hashTable = new Hashtable<String, String>();
hashTable.put("a", "aa");
hashTable.put("b", "bb");
hashTable.put("c", "cc");
List<String> valueList = new ArrayList<String>(hashTable.values());
Enumeration<String> enumeration = hashTable.elements();
DelegateEnumeration<String> delegateEnumeration = new DelegateEnumeration<String>(enumeration, new DelegateEnumeration.Filter<String>() {
@Override
public boolean filter(String s) {
if ("bb".equals(s)) {
return true;
}
return false;
}
});
Assert.assertTrue(delegateEnumeration.hasMoreElements());
Assert.assertTrue(valueList.remove(delegateEnumeration.nextElement()));
Assert.assertTrue(delegateEnumeration.hasMoreElements());
Assert.assertTrue(valueList.remove(delegateEnumeration.nextElement()));
Assert.assertEquals(valueList.size(), 1);
Assert.assertFalse(delegateEnumeration.hasMoreElements());
assertNextElements_Expected_ExceptionEmulation(enumeration, delegateEnumeration);
Assert.assertEquals(valueList.size(), 1);
Assert.assertEquals(valueList.get(0), "bb");
}
@Test
public void testExceptionTest_Exception() throws Exception {
Hashtable<String, String> hashTable = new Hashtable<String, String>();
Enumeration<String> enumeration = hashTable.elements();
DelegateEnumeration<String> delegateEnumeration = new DelegateEnumeration<String>(enumeration);
Assert.assertFalse(delegateEnumeration.hasMoreElements());
Assert.assertFalse(delegateEnumeration.hasMoreElements());
Assert.assertFalse(delegateEnumeration.hasMoreElements());
assertNextElements_Expected_ExceptionEmulation(enumeration, delegateEnumeration);
Assert.assertFalse(delegateEnumeration.hasMoreElements());
assertNextElements_Expected_ExceptionEmulation(enumeration, delegateEnumeration);
assertNextElements_Expected_ExceptionEmulation(enumeration, delegateEnumeration);
Assert.assertFalse(delegateEnumeration.hasMoreElements());
}
@Test
public void testExceptionTest_Exception2() throws Exception {
Enumeration enumeration = mock(Enumeration.class);
when(enumeration.hasMoreElements()).thenReturn(false);
when(enumeration.nextElement()).thenThrow(new NoSuchElementException());
DelegateEnumeration<String> delegateEnumeration = new DelegateEnumeration<String>(enumeration);
Assert.assertEquals(enumeration.hasMoreElements(), delegateEnumeration.hasMoreElements());
Assert.assertEquals(enumeration.hasMoreElements(), delegateEnumeration.hasMoreElements());
assertNextElements_Expected_ExceptionEmulation(enumeration, delegateEnumeration);
Assert.assertEquals(enumeration.hasMoreElements(), delegateEnumeration.hasMoreElements());
assertNextElements_Expected_ExceptionEmulation(enumeration, delegateEnumeration);
assertNextElements_Expected_ExceptionEmulation(enumeration, delegateEnumeration);
Assert.assertEquals(enumeration.hasMoreElements(), delegateEnumeration.hasMoreElements());
}
@Test
public void testExceptionTest_Null() throws Exception {
Enumeration enumeration = mock(Enumeration.class);
when(enumeration.hasMoreElements()).thenReturn(false);
when(enumeration.nextElement()).thenReturn(null);
DelegateEnumeration<String> delegateEnumeration = new DelegateEnumeration<String>(enumeration);
Assert.assertFalse(delegateEnumeration.hasMoreElements());
Assert.assertFalse(delegateEnumeration.hasMoreElements());
Assert.assertSame(delegateEnumeration.nextElement(), null);
Assert.assertSame(delegateEnumeration.nextElement(), null);
Assert.assertFalse(delegateEnumeration.hasMoreElements());
}
@Test
public void testExceptionTest_Null2() throws Exception {
Enumeration<String> enumeration = new Enumeration<String>() {
private boolean first = true;
@Override
public boolean hasMoreElements() {
return first;
}
@Override
public String nextElement() {
if (first) {
first = false;
return "exist";
}
return null;
}
};
DelegateEnumeration<String> delegateEnumeration = new DelegateEnumeration<String>(enumeration);
Assert.assertTrue(delegateEnumeration.hasMoreElements());
Assert.assertTrue(delegateEnumeration.hasMoreElements());
Assert.assertSame(delegateEnumeration.nextElement(), "exist");
Assert.assertFalse(delegateEnumeration.hasMoreElements());
Assert.assertSame(delegateEnumeration.nextElement(), null);
Assert.assertSame(delegateEnumeration.nextElement(), null);
Assert.assertFalse(delegateEnumeration.hasMoreElements());
}
private void assertNextElements_Expected_ExceptionEmulation(Enumeration<String> elements, DelegateEnumeration<String> delegateEnumeration) {
Exception original = getException(elements);
Assert.assertNotSame(original, null);
Exception delegate = getException(delegateEnumeration);
Assert.assertNotSame(delegate, null);
Assert.assertEquals(original.getClass(), delegate.getClass());
Assert.assertEquals(original.getMessage(), delegate.getMessage());
Assert.assertEquals(original.getCause(), delegate.getCause());
}
private Exception getException(Enumeration elements) {
try {
elements.nextElement();
} catch (Exception e) {
return e;
}
Assert.fail("NoSuchElementException");
return null;
}
}