// Path: ghostwriter-test-java-v7/src/main/java/io/ghostwriter/message/EnteringMessage.java
// public class EnteringMessage extends Message<EnteringMessage.BasePayload> {
// 
//     public EnteringMessage(Object source, String method) {
//         this(source, method, NoParameters.INSTANCE);
//     }
// 
//     public EnteringMessage(Object source,  String method, BasePayload payload) {
//         super(source, method, payload);
//     }
// 
//     public boolean hasParameters() {
//         BasePayload payload = getPayload();
//         return !NoParameters.INSTANCE.equals(payload);
//     }
// 
//     @Override
//     public String toString() {
//         return super.toString() + getPayload().toString();
//     }
// 
//     public static abstract class BasePayload {
// 
//         protected BasePayload() {
//         }
// 
//         public abstract Object[] getParameters();
// 
//     }
// 
//     // cannot use enum for the singleton pattern since that doesn't support 'extend'
//     protected static class NoParameters extends BasePayload {
//         public static NoParameters INSTANCE = new NoParameters();
// 
//         private NoParameters() {
//         }
// 
//         @Override
//         public Object[] getParameters() {
//             return null;
//         }
// 
//         @Override
//         public String toString() {
//             return "()";
//         }
//     }
// 
//     public static class Payload extends BasePayload {
// 
//         final private Object[] parameters;
// 
//         public Payload(Object[] parameters) {
//             this.parameters = parameters;
//         }
// 
//         public Object[] getParameters() {
//             return parameters;
//         }
// 
//         @Override
//         public String toString() {
//             StringBuffer sb = new StringBuffer();
//             sb.append(super.toString()).append("(");
//             final int UPPER_BOUND = parameters.length - 1;
//             final int SIZE_OF_ENTRY_PAIRS = 2;
//             for (int i = 0; i < UPPER_BOUND; i += SIZE_OF_ENTRY_PAIRS) {
//                 Object name = parameters[i];
//                 Object value = parameters[i + 1];
//                 sb.append(name).append(" = ").append(value);
//                 if (i != UPPER_BOUND - 1) {
//                     sb.append(", ");
//                 }
//             }
//             sb.append(")");
// 
//             return sb.toString();
//         }
//     }
// }
// 
// Path: ghostwriter-test-java-v7/src/main/java/io/ghostwriter/message/Message.java
// public class Message<T> {
// 
//     final private Object source;
// 
//     final private String method;
// 
//     final private T payload;
// 
//     public Message(Object source, String method, T payload) {
//         this.source = source;
//         this.method = method;
//         this.payload = payload;
//     }
// 
//     public Object getSource() {
//         return source;
//     }
// 
//     public String getMethod() {
//         return method;
//     }
// 
//     public T getPayload() {
//         return payload;
//     }
// 
//     @Override
//     public String toString() {
//         StringBuffer sb = new StringBuffer();
//         sb.append(this.getClass().getSimpleName().toString())
// //                .append(String.valueOf(source))
//                 .append(".")
//                 .append(method);
// 
//         return sb.toString();
//     }
// }
// 
// Path: ghostwriter-test-java-v7/src/main/java/io/ghostwriter/test/TestBase.java
// public class TestBase {
// 
//     public static final int NUMBER_OF_ENTRIES_PER_TRACED_PARAMETER = 2; // first value should be the name, the second one is the value of the parameter
// 
//     @BeforeClass
//     public static void setup() {
//         // switch to the in-memory implementation, so we can do unit testing.
//         GhostWriter.setTracerProvider(InMemoryTracerProvider.INSTANCE);
//     }
// 
//     @Before
//     public void configureInMemoryTracer() {
//         fetchedPreparedInMemoryTracer();
//     }
// 
//     //FIXME(snorbi07): refactor to a more meaningful name... the difficulty is coming up with one
//     public InMemoryTracer fetchedPreparedInMemoryTracer() {
//         InMemoryTracer tracer = InMemoryTracerProvider.INSTANCE.getTracer();
//         // we only need value change tracker in the specific tests and there we enable it manually
//         tracer.disableValueChangeTracking();
//         // make sure that entering/exiting tracing is enabled.
//         tracer.enableEnteringExitingTracking();
//         // we clear manually because the @Test method is also traced and it pollutes the entering logs.
//         tracer.clearMessages();
// 
//         return tracer;
//     }
// 
//     public void disableValueChangeTracking() {
//         InMemoryTracerProvider.INSTANCE.getTracer().disableValueChangeTracking();
//     }
// 
//     public void enableValueChangeTracking() {
//         InMemoryTracerProvider.INSTANCE.getTracer().enableValueChangeTracking();
//     }
// 
// }


import io.ghostwriter.message.EnteringMessage;
import io.ghostwriter.message.Message;
import io.ghostwriter.test.TestBase;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static org.junit.Assert.assertTrue;
package io.ghostwriter;




public class EnteringTest extends TestBase {

    @Test
    public void testMethodWithNoParametersAndNoResultEntering() {
        InMemoryTracer inMemoryTracer = fetchedPreparedInMemoryTracer();
        methodWithNoParametersAndNoResult();
        // pop the unused exitingMessage
        inMemoryTracer.popMessage();
        Message<?> enteringMessage = inMemoryTracer.popMessage();
// Path: ghostwriter-test-java-v7/src/main/java/io/ghostwriter/message/EnteringMessage.java
// public class EnteringMessage extends Message<EnteringMessage.BasePayload> {
// 
//     public EnteringMessage(Object source, String method) {
//         this(source, method, NoParameters.INSTANCE);
//     }
// 
//     public EnteringMessage(Object source,  String method, BasePayload payload) {
//         super(source, method, payload);
//     }
// 
//     public boolean hasParameters() {
//         BasePayload payload = getPayload();
//         return !NoParameters.INSTANCE.equals(payload);
//     }
// 
//     @Override
//     public String toString() {
//         return super.toString() + getPayload().toString();
//     }
// 
//     public static abstract class BasePayload {
// 
//         protected BasePayload() {
//         }
// 
//         public abstract Object[] getParameters();
// 
//     }
// 
//     // cannot use enum for the singleton pattern since that doesn't support 'extend'
//     protected static class NoParameters extends BasePayload {
//         public static NoParameters INSTANCE = new NoParameters();
// 
//         private NoParameters() {
//         }
// 
//         @Override
//         public Object[] getParameters() {
//             return null;
//         }
// 
//         @Override
//         public String toString() {
//             return "()";
//         }
//     }
// 
//     public static class Payload extends BasePayload {
// 
//         final private Object[] parameters;
// 
//         public Payload(Object[] parameters) {
//             this.parameters = parameters;
//         }
// 
//         public Object[] getParameters() {
//             return parameters;
//         }
// 
//         @Override
//         public String toString() {
//             StringBuffer sb = new StringBuffer();
//             sb.append(super.toString()).append("(");
//             final int UPPER_BOUND = parameters.length - 1;
//             final int SIZE_OF_ENTRY_PAIRS = 2;
//             for (int i = 0; i < UPPER_BOUND; i += SIZE_OF_ENTRY_PAIRS) {
//                 Object name = parameters[i];
//                 Object value = parameters[i + 1];
//                 sb.append(name).append(" = ").append(value);
//                 if (i != UPPER_BOUND - 1) {
//                     sb.append(", ");
//                 }
//             }
//             sb.append(")");
// 
//             return sb.toString();
//         }
//     }
// }
// 
// Path: ghostwriter-test-java-v7/src/main/java/io/ghostwriter/message/Message.java
// public class Message<T> {
// 
//     final private Object source;
// 
//     final private String method;
// 
//     final private T payload;
// 
//     public Message(Object source, String method, T payload) {
//         this.source = source;
//         this.method = method;
//         this.payload = payload;
//     }
// 
//     public Object getSource() {
//         return source;
//     }
// 
//     public String getMethod() {
//         return method;
//     }
// 
//     public T getPayload() {
//         return payload;
//     }
// 
//     @Override
//     public String toString() {
//         StringBuffer sb = new StringBuffer();
//         sb.append(this.getClass().getSimpleName().toString())
// //                .append(String.valueOf(source))
//                 .append(".")
//                 .append(method);
// 
//         return sb.toString();
//     }
// }
// 
// Path: ghostwriter-test-java-v7/src/main/java/io/ghostwriter/test/TestBase.java
// public class TestBase {
// 
//     public static final int NUMBER_OF_ENTRIES_PER_TRACED_PARAMETER = 2; // first value should be the name, the second one is the value of the parameter
// 
//     @BeforeClass
//     public static void setup() {
//         // switch to the in-memory implementation, so we can do unit testing.
//         GhostWriter.setTracerProvider(InMemoryTracerProvider.INSTANCE);
//     }
// 
//     @Before
//     public void configureInMemoryTracer() {
//         fetchedPreparedInMemoryTracer();
//     }
// 
//     //FIXME(snorbi07): refactor to a more meaningful name... the difficulty is coming up with one
//     public InMemoryTracer fetchedPreparedInMemoryTracer() {
//         InMemoryTracer tracer = InMemoryTracerProvider.INSTANCE.getTracer();
//         // we only need value change tracker in the specific tests and there we enable it manually
//         tracer.disableValueChangeTracking();
//         // make sure that entering/exiting tracing is enabled.
//         tracer.enableEnteringExitingTracking();
//         // we clear manually because the @Test method is also traced and it pollutes the entering logs.
//         tracer.clearMessages();
// 
//         return tracer;
//     }
// 
//     public void disableValueChangeTracking() {
//         InMemoryTracerProvider.INSTANCE.getTracer().disableValueChangeTracking();
//     }
// 
//     public void enableValueChangeTracking() {
//         InMemoryTracerProvider.INSTANCE.getTracer().enableValueChangeTracking();
//     }
// 
// }


// Path: ghostwriter-test-java-v7/src/test/java/io/ghostwriter/EnteringTest.java
import io.ghostwriter.message.EnteringMessage;
import io.ghostwriter.message.Message;
import io.ghostwriter.test.TestBase;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static org.junit.Assert.assertTrue;

package io.ghostwriter;




public class EnteringTest extends TestBase {

    @Test
    public void testMethodWithNoParametersAndNoResultEntering() {
        InMemoryTracer inMemoryTracer = fetchedPreparedInMemoryTracer();
        methodWithNoParametersAndNoResult();
        // pop the unused exitingMessage
        inMemoryTracer.popMessage();
        Message<?> enteringMessage = inMemoryTracer.popMessage();
        boolean isEnteringMessage = enteringMessage instanceof EnteringMessage;