// Path: src/test/java/com/lmax/tool/disruptor/BatchAwareListenerImpl.java
// public final class BatchAwareListenerImpl implements Listener, BatchListener
// {
//     private volatile int batchCount = 0;
// 
//     @Override
//     public void onString(final String value)
//     {
//     }
// 
//     @Override
//     public void onFloatAndInt(final Float floatValue, final int intValue)
//     {
//     }
// 
//     @Override
//     public void onVoid()
//     {
//     }
// 
//     @Override
//     public void onObjectArray(final Double[] value)
//     {
//     }
// 
//     @Override
//     public void onMixedMultipleArgs(final int int0, final int int1, final String s0, final String s1, final int i2)
//     {
//     }
// 
//     public int getBatchCount()
//     {
//         return batchCount;
//     }
// 
//     @Override
//     public void onEndOfBatch()
//     {
//         batchCount++;
//     }
// }
// 
// Path: src/main/java/com/lmax/tool/disruptor/Invoker.java
// public interface Invoker
// {
//     void invokeWithArgumentHolder(final Object implementation, final Object argumentHolder);
// }
// 
// Path: src/test/java/com/lmax/tool/disruptor/ListenerImpl.java
// public final class ListenerImpl implements Listener
// {
//     private volatile String lastStringValue;
//     private volatile int lastIntValue;
//     private volatile Float lastFloatValue;
//     private volatile int voidInvocationCount;
//     private volatile Double[] lastDoubleArray;
//     private int mixedArgsInvocationCount;
// 
//     @Override
//     public void onString(final String value)
//     {
//         lastStringValue = value;
//     }
// 
//     @Override
//     public void onFloatAndInt(final Float floatValue, final int intValue)
//     {
//         lastFloatValue = floatValue;
//         lastIntValue = intValue;
//     }
// 
//     @Override
//     public void onVoid()
//     {
//         voidInvocationCount++;
//     }
// 
//     @Override
//     public void onObjectArray(final Double[] value)
//     {
//         lastDoubleArray = value;
//     }
// 
//     @Override
//     public void onMixedMultipleArgs(final int int0, final int int1, final String s0, final String s1, final int i2)
//     {
//         mixedArgsInvocationCount++;
//     }
// 
//     public String getLastStringValue()
//     {
//         return lastStringValue;
//     }
// 
//     public int getLastIntValue()
//     {
//         return lastIntValue;
//     }
// 
//     public Float getLastFloatValue()
//     {
//         return lastFloatValue;
//     }
// 
//     public int getVoidInvocationCount()
//     {
//         return voidInvocationCount;
//     }
// 
//     public Double[] getLastDoubleArray()
//     {
//         return lastDoubleArray;
//     }
// 
//     public int getMixedArgsInvocationCount()
//     {
//         return mixedArgsInvocationCount;
//     }
// }
// 
// Path: src/main/java/com/lmax/tool/disruptor/ProxyMethodInvocation.java
// public final class ProxyMethodInvocation
// {
//     private Invoker invoker;
//     private Resetable argumentHolder;
// 
//     public Invoker getInvoker()
//     {
//         return invoker;
//     }
// 
//     public void setInvoker(final Invoker invoker)
//     {
//         this.invoker = invoker;
//     }
// 
//     public void setArgumentHolder(final Resetable argumentHolder)
//     {
//         this.argumentHolder = argumentHolder;
//     }
// 
//     public Object getArgumentHolder()
//     {
//         return argumentHolder;
//     }
// 
//     public void reset()
//     {
//         argumentHolder.reset();
//     }
// }
// 
// Path: src/main/java/com/lmax/tool/disruptor/Resetable.java
// public interface Resetable
// {
//     /**
//      * Reset this component
//      */
//     void reset();
// }
// 
// Path: src/main/java/com/lmax/tool/disruptor/handlers/Handlers.java
// public static <T> EventHandler<ProxyMethodInvocation> createSingleImplementationHandlerChain(final T implementation)
// {
//     return createHandlers(implementation, true);
// }


import com.lmax.disruptor.EventHandler;
import com.lmax.tool.disruptor.BatchAwareListenerImpl;
import com.lmax.tool.disruptor.Invoker;
import com.lmax.tool.disruptor.ListenerImpl;
import com.lmax.tool.disruptor.ProxyMethodInvocation;
import com.lmax.tool.disruptor.Resetable;
import org.junit.Test;
import static com.lmax.tool.disruptor.handlers.Handlers.createSingleImplementationHandlerChain;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
/*
 * Copyright 2015-2016 LMAX Ltd.
 *
 *    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.lmax.tool.disruptor.handlers;




public final class HandlersTest
{
    @Test
    public void shouldNotifyBatchListenerOnEndOfBatch() throws Exception
    {
        final BatchAwareListenerImpl batchAwareListener = new BatchAwareListenerImpl();
        final EventHandler<ProxyMethodInvocation> eventHandler = createSingleImplementationHandlerChain(batchAwareListener);
        final ProxyMethodInvocation proxyMethodInvocation = new ProxyMethodInvocation();
        proxyMethodInvocation.setArgumentHolder(new StubResetable());
        proxyMethodInvocation.setInvoker(new NoOpInvoker());

        eventHandler.onEvent(proxyMethodInvocation, 17L, true);

        assertThat(batchAwareListener.getBatchCount(), is(1));
    }

    @Test
    public void shouldNotNotifyNonBatchListenerOnEndOfBatch() throws Exception
    {
// Path: src/test/java/com/lmax/tool/disruptor/BatchAwareListenerImpl.java
// public final class BatchAwareListenerImpl implements Listener, BatchListener
// {
//     private volatile int batchCount = 0;
// 
//     @Override
//     public void onString(final String value)
//     {
//     }
// 
//     @Override
//     public void onFloatAndInt(final Float floatValue, final int intValue)
//     {
//     }
// 
//     @Override
//     public void onVoid()
//     {
//     }
// 
//     @Override
//     public void onObjectArray(final Double[] value)
//     {
//     }
// 
//     @Override
//     public void onMixedMultipleArgs(final int int0, final int int1, final String s0, final String s1, final int i2)
//     {
//     }
// 
//     public int getBatchCount()
//     {
//         return batchCount;
//     }
// 
//     @Override
//     public void onEndOfBatch()
//     {
//         batchCount++;
//     }
// }
// 
// Path: src/main/java/com/lmax/tool/disruptor/Invoker.java
// public interface Invoker
// {
//     void invokeWithArgumentHolder(final Object implementation, final Object argumentHolder);
// }
// 
// Path: src/test/java/com/lmax/tool/disruptor/ListenerImpl.java
// public final class ListenerImpl implements Listener
// {
//     private volatile String lastStringValue;
//     private volatile int lastIntValue;
//     private volatile Float lastFloatValue;
//     private volatile int voidInvocationCount;
//     private volatile Double[] lastDoubleArray;
//     private int mixedArgsInvocationCount;
// 
//     @Override
//     public void onString(final String value)
//     {
//         lastStringValue = value;
//     }
// 
//     @Override
//     public void onFloatAndInt(final Float floatValue, final int intValue)
//     {
//         lastFloatValue = floatValue;
//         lastIntValue = intValue;
//     }
// 
//     @Override
//     public void onVoid()
//     {
//         voidInvocationCount++;
//     }
// 
//     @Override
//     public void onObjectArray(final Double[] value)
//     {
//         lastDoubleArray = value;
//     }
// 
//     @Override
//     public void onMixedMultipleArgs(final int int0, final int int1, final String s0, final String s1, final int i2)
//     {
//         mixedArgsInvocationCount++;
//     }
// 
//     public String getLastStringValue()
//     {
//         return lastStringValue;
//     }
// 
//     public int getLastIntValue()
//     {
//         return lastIntValue;
//     }
// 
//     public Float getLastFloatValue()
//     {
//         return lastFloatValue;
//     }
// 
//     public int getVoidInvocationCount()
//     {
//         return voidInvocationCount;
//     }
// 
//     public Double[] getLastDoubleArray()
//     {
//         return lastDoubleArray;
//     }
// 
//     public int getMixedArgsInvocationCount()
//     {
//         return mixedArgsInvocationCount;
//     }
// }
// 
// Path: src/main/java/com/lmax/tool/disruptor/ProxyMethodInvocation.java
// public final class ProxyMethodInvocation
// {
//     private Invoker invoker;
//     private Resetable argumentHolder;
// 
//     public Invoker getInvoker()
//     {
//         return invoker;
//     }
// 
//     public void setInvoker(final Invoker invoker)
//     {
//         this.invoker = invoker;
//     }
// 
//     public void setArgumentHolder(final Resetable argumentHolder)
//     {
//         this.argumentHolder = argumentHolder;
//     }
// 
//     public Object getArgumentHolder()
//     {
//         return argumentHolder;
//     }
// 
//     public void reset()
//     {
//         argumentHolder.reset();
//     }
// }
// 
// Path: src/main/java/com/lmax/tool/disruptor/Resetable.java
// public interface Resetable
// {
//     /**
//      * Reset this component
//      */
//     void reset();
// }
// 
// Path: src/main/java/com/lmax/tool/disruptor/handlers/Handlers.java
// public static <T> EventHandler<ProxyMethodInvocation> createSingleImplementationHandlerChain(final T implementation)
// {
//     return createHandlers(implementation, true);
// }


// Path: src/test/java/com/lmax/tool/disruptor/handlers/HandlersTest.java
import com.lmax.disruptor.EventHandler;
import com.lmax.tool.disruptor.BatchAwareListenerImpl;
import com.lmax.tool.disruptor.Invoker;
import com.lmax.tool.disruptor.ListenerImpl;
import com.lmax.tool.disruptor.ProxyMethodInvocation;
import com.lmax.tool.disruptor.Resetable;
import org.junit.Test;
import static com.lmax.tool.disruptor.handlers.Handlers.createSingleImplementationHandlerChain;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

/*
 * Copyright 2015-2016 LMAX Ltd.
 *
 *    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.lmax.tool.disruptor.handlers;




public final class HandlersTest
{
    @Test
    public void shouldNotifyBatchListenerOnEndOfBatch() throws Exception
    {
        final BatchAwareListenerImpl batchAwareListener = new BatchAwareListenerImpl();
        final EventHandler<ProxyMethodInvocation> eventHandler = createSingleImplementationHandlerChain(batchAwareListener);
        final ProxyMethodInvocation proxyMethodInvocation = new ProxyMethodInvocation();
        proxyMethodInvocation.setArgumentHolder(new StubResetable());
        proxyMethodInvocation.setInvoker(new NoOpInvoker());

        eventHandler.onEvent(proxyMethodInvocation, 17L, true);

        assertThat(batchAwareListener.getBatchCount(), is(1));
    }

    @Test
    public void shouldNotNotifyNonBatchListenerOnEndOfBatch() throws Exception
    {
        final ListenerImpl nonBatchAwareListener = new ListenerImpl();