package net.bytebuddy.agent.builder;
import net.bytebuddy.matcher.ElementMatchers;
import net.bytebuddy.test.utility.ObjectPropertyAssertion;
import org.junit.Test;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
public class AgentBuilderRedefinitionStrategyBatchAllocatorTest {
@Test
public void testForTotalEmpty() throws Exception {
AgentBuilder.RedefinitionStrategy.BatchAllocator batchAllocator = AgentBuilder.RedefinitionStrategy.BatchAllocator.ForTotal.INSTANCE;
Iterator<? extends List<Class<?>>> iterator = batchAllocator.batch(Collections.<Class<?>>emptyList()).iterator();
assertThat(iterator.hasNext(), is(false));
}
@Test
public void testForTotal() throws Exception {
AgentBuilder.RedefinitionStrategy.BatchAllocator batchAllocator = AgentBuilder.RedefinitionStrategy.BatchAllocator.ForTotal.INSTANCE;
Iterator<? extends List<Class<?>>> iterator = batchAllocator.batch(Arrays.<Class<?>>asList(Object.class, Void.class, String.class)).iterator();
assertThat(iterator.hasNext(), is(true));
assertThat(iterator.next(), is(Arrays.<Class<?>>asList(Object.class, Void.class, String.class)));
assertThat(iterator.hasNext(), is(false));
}
@Test
public void testForFixed() throws Exception {
AgentBuilder.RedefinitionStrategy.BatchAllocator batchAllocator = new AgentBuilder.RedefinitionStrategy.BatchAllocator.ForFixedSize(2);
Iterator<? extends List<Class<?>>> iterator = batchAllocator.batch(Arrays.<Class<?>>asList(Object.class, Void.class, String.class)).iterator();
assertThat(iterator.hasNext(), is(true));
assertThat(iterator.next(), is(Arrays.<Class<?>>asList(Object.class, Void.class)));
assertThat(iterator.hasNext(), is(true));
assertThat(iterator.next(), is(Collections.<Class<?>>singletonList(String.class)));
assertThat(iterator.hasNext(), is(false));
}
@Test
public void testForFixedFactory() throws Exception {
assertThat(AgentBuilder.RedefinitionStrategy.BatchAllocator.ForFixedSize.ofSize(1),
is((AgentBuilder.RedefinitionStrategy.BatchAllocator) new AgentBuilder.RedefinitionStrategy.BatchAllocator.ForFixedSize(1)));
assertThat(AgentBuilder.RedefinitionStrategy.BatchAllocator.ForFixedSize.ofSize(0),
is((AgentBuilder.RedefinitionStrategy.BatchAllocator) AgentBuilder.RedefinitionStrategy.BatchAllocator.ForTotal.INSTANCE));
}
@Test(expected = IllegalArgumentException.class)
public void testForFixedFactoryIllegal() throws Exception {
AgentBuilder.RedefinitionStrategy.BatchAllocator.ForFixedSize.ofSize(-1);
}
@Test
@SuppressWarnings("unchecked")
public void testGrouping() throws Exception {
Iterator<? extends List<Class<?>>> batches = new AgentBuilder.RedefinitionStrategy.BatchAllocator.ForMatchedGrouping(ElementMatchers.is(Object.class),
ElementMatchers.is(Void.class)).batch(Arrays.<Class<?>>asList(Object.class, Void.class, String.class)).iterator();
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Collections.<Class<?>>singletonList(Object.class)));
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Collections.<Class<?>>singletonList(Void.class)));
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Collections.<Class<?>>singletonList(String.class)));
assertThat(batches.hasNext(), is(false));
}
@Test
@SuppressWarnings("unchecked")
public void testEmptyGrouping() throws Exception {
Iterator<? extends List<Class<?>>> batches = new AgentBuilder.RedefinitionStrategy.BatchAllocator.ForMatchedGrouping(ElementMatchers.is(Object.class))
.batch(Collections.<Class<?>>emptyList()).iterator();
assertThat(batches.hasNext(), is(false));
}
@Test
@SuppressWarnings("unchecked")
public void testMinimum() throws Exception {
Iterator<? extends List<Class<?>>> batches = new AgentBuilder.RedefinitionStrategy.BatchAllocator.ForMatchedGrouping(ElementMatchers.is(Object.class),
ElementMatchers.is(Void.class)).withMinimum(3).batch(Arrays.<Class<?>>asList(Object.class, Void.class, String.class)).iterator();
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Arrays.<Class<?>>asList(Object.class, Void.class, String.class)));
assertThat(batches.hasNext(), is(false));
}
@Test
@SuppressWarnings("unchecked")
public void testMinimumExcess() throws Exception {
Iterator<? extends List<Class<?>>> batches = new AgentBuilder.RedefinitionStrategy.BatchAllocator.ForMatchedGrouping(ElementMatchers.is(Object.class),
ElementMatchers.is(Void.class)).withMinimum(10).batch(Arrays.<Class<?>>asList(Object.class, Void.class, String.class)).iterator();
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Arrays.<Class<?>>asList(Object.class, Void.class, String.class)));
assertThat(batches.hasNext(), is(false));
}
@Test
@SuppressWarnings("unchecked")
public void testMinimumChunked() throws Exception {
Iterator<? extends List<Class<?>>> batches = new AgentBuilder.RedefinitionStrategy.BatchAllocator.ForMatchedGrouping(ElementMatchers.is(Object.class),
ElementMatchers.is(Void.class)).withMinimum(2).batch(Arrays.<Class<?>>asList(Object.class, Void.class, String.class)).iterator();
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Arrays.<Class<?>>asList(Object.class, Void.class)));
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Collections.<Class<?>>singletonList(String.class)));
assertThat(batches.hasNext(), is(false));
}
@Test(expected = UnsupportedOperationException.class)
@SuppressWarnings("unchecked")
public void testMinimumCannotRemove() throws Exception {
new AgentBuilder.RedefinitionStrategy.BatchAllocator.ForMatchedGrouping(ElementMatchers.is(Object.class))
.withMinimum(2)
.batch(Collections.<Class<?>>singletonList(Object.class))
.iterator()
.remove();
}
@Test(expected = IllegalArgumentException.class)
@SuppressWarnings("unchecked")
public void testMinimumNonPositive() throws Exception {
new AgentBuilder.RedefinitionStrategy.BatchAllocator.ForMatchedGrouping(ElementMatchers.is(Object.class)).withMinimum(0);
}
@Test
@SuppressWarnings("unchecked")
public void testMaximum() throws Exception {
Iterator<? extends List<Class<?>>> batches = new AgentBuilder.RedefinitionStrategy.BatchAllocator.ForMatchedGrouping(ElementMatchers.is(Object.class)
.or(ElementMatchers.is(Void.class))).withMaximum(1).batch(Arrays.<Class<?>>asList(Object.class, Void.class, String.class)).iterator();
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Collections.<Class<?>>singletonList(Object.class)));
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Collections.<Class<?>>singletonList(Void.class)));
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Collections.<Class<?>>singletonList(String.class)));
assertThat(batches.hasNext(), is(false));
}
@Test
@SuppressWarnings("unchecked")
public void testMaximumExcess() throws Exception {
Iterator<? extends List<Class<?>>> batches = new AgentBuilder.RedefinitionStrategy.BatchAllocator.ForMatchedGrouping(ElementMatchers.is(Object.class)
.or(ElementMatchers.is(Void.class))).withMaximum(10).batch(Arrays.<Class<?>>asList(Object.class, Void.class, String.class)).iterator();
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Arrays.<Class<?>>asList(Object.class, Void.class)));
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Collections.<Class<?>>singletonList(String.class)));
assertThat(batches.hasNext(), is(false));
}
@Test
@SuppressWarnings("unchecked")
public void testMaximumChunked() throws Exception {
Iterator<? extends List<Class<?>>> batches = new AgentBuilder.RedefinitionStrategy.BatchAllocator.ForMatchedGrouping(ElementMatchers.any())
.withMaximum(2)
.batch(Arrays.<Class<?>>asList(Object.class, Void.class, String.class))
.iterator();
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Arrays.<Class<?>>asList(Object.class, Void.class)));
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Collections.<Class<?>>singletonList(String.class)));
assertThat(batches.hasNext(), is(false));
}
@Test(expected = UnsupportedOperationException.class)
@SuppressWarnings("unchecked")
public void testMaximumCannotRemove() throws Exception {
new AgentBuilder.RedefinitionStrategy.BatchAllocator.ForMatchedGrouping(ElementMatchers.is(Object.class))
.withMaximum(2)
.batch(Collections.<Class<?>>singletonList(Object.class))
.iterator()
.remove();
}
@Test(expected = IllegalArgumentException.class)
@SuppressWarnings("unchecked")
public void testMaximumNonPositive() throws Exception {
new AgentBuilder.RedefinitionStrategy.BatchAllocator.ForMatchedGrouping(ElementMatchers.is(Object.class)).withMaximum(0);
}
@Test
@SuppressWarnings("unchecked")
public void testRange() throws Exception {
Iterator<? extends List<Class<?>>> batches = new AgentBuilder.RedefinitionStrategy.BatchAllocator.ForMatchedGrouping(ElementMatchers.is(Object.class)
.or(ElementMatchers.is(Void.class))).withinRange(1, 1).batch(Arrays.<Class<?>>asList(Object.class, Void.class, String.class)).iterator();
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Collections.<Class<?>>singletonList(Object.class)));
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Collections.<Class<?>>singletonList(Void.class)));
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Collections.<Class<?>>singletonList(String.class)));
assertThat(batches.hasNext(), is(false));
}
@Test
@SuppressWarnings("unchecked")
public void testRangeExcess() throws Exception {
Iterator<? extends List<Class<?>>> batches = new AgentBuilder.RedefinitionStrategy.BatchAllocator.ForMatchedGrouping(ElementMatchers.is(Object.class)
.or(ElementMatchers.is(Void.class))).withinRange(1, 10).batch(Arrays.<Class<?>>asList(Object.class, Void.class, String.class)).iterator();
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Arrays.<Class<?>>asList(Object.class, Void.class)));
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Collections.<Class<?>>singletonList(String.class)));
assertThat(batches.hasNext(), is(false));
}
@Test
@SuppressWarnings("unchecked")
public void testRangeChunked() throws Exception {
Iterator<? extends List<Class<?>>> batches = new AgentBuilder.RedefinitionStrategy.BatchAllocator.ForMatchedGrouping(ElementMatchers.any())
.withinRange(1, 2)
.batch(Arrays.<Class<?>>asList(Object.class, Void.class, String.class))
.iterator();
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Arrays.<Class<?>>asList(Object.class, Void.class)));
assertThat(batches.hasNext(), is(true));
assertThat(batches.next(), is(Collections.<Class<?>>singletonList(String.class)));
assertThat(batches.hasNext(), is(false));
}
@Test(expected = UnsupportedOperationException.class)
@SuppressWarnings("unchecked")
public void testRangeCannotRemove() throws Exception {
new AgentBuilder.RedefinitionStrategy.BatchAllocator.ForMatchedGrouping(ElementMatchers.is(Object.class))
.withinRange(1, 2)
.batch(Collections.<Class<?>>singletonList(Object.class))
.iterator()
.remove();
}
@Test
public void testPartitioningWithoutReminder() throws Exception {
Iterator<? extends List<Class<?>>> iterator = new AgentBuilder.RedefinitionStrategy.BatchAllocator.Partitioning(2)
.batch(Arrays.<Class<?>>asList(Object.class, Void.class))
.iterator();
assertThat(iterator.hasNext(), is(true));
assertThat(iterator.next(), is(Collections.<Class<?>>singletonList(Object.class)));
assertThat(iterator.hasNext(), is(true));
assertThat(iterator.next(), is(Collections.<Class<?>>singletonList(Void.class)));
assertThat(iterator.hasNext(), is(false));
}
@Test
public void testPartitioningWithReminder() throws Exception {
Iterator<? extends List<Class<?>>> iterator = new AgentBuilder.RedefinitionStrategy.BatchAllocator.Partitioning(2)
.batch(Arrays.<Class<?>>asList(Object.class, Void.class, String.class))
.iterator();
assertThat(iterator.hasNext(), is(true));
assertThat(iterator.next(), is(Arrays.<Class<?>>asList(Object.class, Void.class)));
assertThat(iterator.hasNext(), is(true));
assertThat(iterator.next(), is(Collections.<Class<?>>singletonList(String.class)));
assertThat(iterator.hasNext(), is(false));
}
@Test
public void testPartitioningWithReminderAndNoRegularPartition() throws Exception {
Iterator<? extends List<Class<?>>> iterator = new AgentBuilder.RedefinitionStrategy.BatchAllocator.Partitioning(2)
.batch(Collections.<Class<?>>singletonList(Object.class))
.iterator();
assertThat(iterator.hasNext(), is(true));
assertThat(iterator.next(), is(Collections.<Class<?>>singletonList(Object.class)));
assertThat(iterator.hasNext(), is(false));
}
@Test
public void testPartitioningEmpty() throws Exception {
Iterator<? extends List<Class<?>>> iterator = new AgentBuilder.RedefinitionStrategy.BatchAllocator.Partitioning(2)
.batch(Collections.<Class<?>>emptyList())
.iterator();
assertThat(iterator.hasNext(), is(false));
}
@Test(expected = IllegalArgumentException.class)
public void testPartitioningIllegalArgument() throws Exception {
AgentBuilder.RedefinitionStrategy.BatchAllocator.Partitioning.of(0);
}
@Test
public void testObjectProperties() throws Exception {
ObjectPropertyAssertion.of(AgentBuilder.RedefinitionStrategy.BatchAllocator.ForTotal.class).apply();
ObjectPropertyAssertion.of(AgentBuilder.RedefinitionStrategy.BatchAllocator.ForFixedSize.class).apply();
ObjectPropertyAssertion.of(AgentBuilder.RedefinitionStrategy.BatchAllocator.ForMatchedGrouping.class).apply();
ObjectPropertyAssertion.of(AgentBuilder.RedefinitionStrategy.BatchAllocator.Slicing.class).apply();
ObjectPropertyAssertion.of(AgentBuilder.RedefinitionStrategy.BatchAllocator.Slicing.Partitioning.class).apply();
}
}