// Path: spring-influxdb-orm/src/main/java/com/vgerbot/orm/influxdb/param/ParameterSignature.java
// public class ParameterSignature {
// 	private final int index;
// 	private final String name;
// 	private final Class<?> type;
// 
// 	private ParameterSignature(int index, String name, Class<?> type) {
// 		super();
// 		this.index = index;
// 		this.name = name;
// 		this.type = type;
// 	}
// 
// 	public static ParameterSignature signature(int index, Parameter parameter, String aliasName) {
// 		Class<?> type = parameter.getType();
// 		return new ParameterSignature(index, aliasName, type);
// 	}
// 
// 	public static ParameterSignature signature(int index, Parameter parameter) {
// 		String name = parameter.getName();
// 		Class<?> type = parameter.getType();
// 		return new ParameterSignature(index, name, type);
// 	}
// 
// 	public static List<ParameterSignature> signatures(Method method) {
// 		Parameter[] parameters = method.getParameters();
// 		List<ParameterSignature> signatures = new ArrayList<>(parameters.length);
// 
// 		for (int i = 0; i < parameters.length; i++) {
// 			Parameter parameter = parameters[i];
// 			signatures.add(signature(i, parameter));
// 		}
// 
// 		return signatures;
// 	}
// 
// 	public int getIndex() {
// 		return index;
// 	}
// 
// 	public String getName() {
// 		return name;
// 	}
// 
// 	public Class<?> getType() {
// 		return type;
// 	}
// 
// 	public ParameterValue value(Object value) {
// 		return new ParameterValue(value, this);
// 	}
// }
// 
// Path: spring-influxdb-orm/src/main/java/com/vgerbot/orm/influxdb/param/ParameterValue.java
// public class ParameterValue {
// 	private final Object value;
// 	private final ParameterSignature signature;
// 
// 	public ParameterValue(Object value, ParameterSignature signature) {
// 		super();
// 		this.value = value;
// 		this.signature = signature;
// 	}
// 
// 	public Object getValue() {
// 		return value;
// 	}
// 
// 	public ParameterSignature getSignature() {
// 		return signature;
// 	}
// 
// }
// 
// Path: spring-influxdb-orm/src/main/java/com/vgerbot/orm/influxdb/utils/CommandUtils.java
// public class CommandUtils {
// 	public static String parseCommand(String command, final Map<String, ParameterValue> parameters) {
// 		command = StringUtils.replace(command, "\\$\\{([^\\}]+)\\}", 1, new ReplaceCallback() {
// 			@Override
// 			public String replace(String word, int index, String source) {
// 				ParameterValue parameterValue = parameters.get(word);
// 				if (parameterValue == null || parameterValue.getValue() == null) {
// 					return "";
// 				}
// 				Object value = parameterValue.getValue();
// 				return value.toString();
// 			}
// 		});
// 		command = StringUtils.replace(command, "\\#\\{([^\\}]+)\\}", 1, new ReplaceCallback() {
// 			@Override
// 			public String replace(String word, int index, String source) {
// 				ParameterValue parameterValue = parameters.get(word);
// 				if (parameterValue == null) {
// 					return "";
// 				}
// 				Object value = parameterValue.getValue();
// 				if (value == null) {
// 					return "null";
// 				}
// 				Class<?> type = parameterValue.getSignature().getType();
// 				if (CharSequence.class.isAssignableFrom(type)) {
// 					return "'" + value + "'";
// 				} else if (Date.class.isInstance(value)) {
// 					return Long.toString(TimeUnit.MILLISECONDS.toNanos(((Date) value).getTime()), 10);
// 				}
// 				return value.toString();
// 			}
// 		});
// 		return command;
// 	}
// }


import com.vgerbot.orm.influxdb.param.ParameterSignature;
import com.vgerbot.orm.influxdb.param.ParameterValue;
import com.vgerbot.orm.influxdb.utils.CommandUtils;
import org.junit.Test;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
import java.time.Instant;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import static org.mockito.Mockito.*;
        assertThat(parsedCommand, equalTo("select * from table_name where nickname="));
    }
    @Test
    public void shouldReplaceToEmptyStringIfValueOfPlaceholderIsNull() {
        String parsedCommand = CommandUtils.parseCommand("select * from table_name where nv=${null-value}", parameterValues);
        assertThat(parsedCommand, equalTo("select * from table_name where nv="));
    }
    @Test
    public void shouldReplacePlaceholdersCorrect() {
        String parsedCommand = CommandUtils.parseCommand("select * from table_name where nv=${nickname} and age=${age}", parameterValues);
        assertThat(parsedCommand, equalTo("select * from table_name where nv=mario and age=18"));
    }

    @Test
    public void shouldReplaceCharSequenceRawValueToStringWithAPairOfQuotes() {
        String parsedCommand = CommandUtils.parseCommand("select * from table_name where nv=#{nickname}", parameterValues);
        assertThat(parsedCommand, equalTo("select * from table_name where nv='mario'"));
    }
    @Test
    public void shouldReplaceDateObjectToNanosNumeric() {
        String parsedCommand = CommandUtils.parseCommand("#{birthday}", parameterValues);
        assertThat(parsedCommand, equalTo(Long.toString(TimeUnit.MILLISECONDS.toNanos(CONST_BIRTHDAY.getTime()),10)));
    }

    private static <T> Parameter createParameter(String name, Class<T> type) {
        Parameter parameter = mock(Parameter.class);
        when(parameter.getName()).thenReturn(name);
        when((Object)parameter.getType()).thenReturn((Object)type);
        return parameter;
    }
// Path: spring-influxdb-orm/src/main/java/com/vgerbot/orm/influxdb/param/ParameterSignature.java
// public class ParameterSignature {
// 	private final int index;
// 	private final String name;
// 	private final Class<?> type;
// 
// 	private ParameterSignature(int index, String name, Class<?> type) {
// 		super();
// 		this.index = index;
// 		this.name = name;
// 		this.type = type;
// 	}
// 
// 	public static ParameterSignature signature(int index, Parameter parameter, String aliasName) {
// 		Class<?> type = parameter.getType();
// 		return new ParameterSignature(index, aliasName, type);
// 	}
// 
// 	public static ParameterSignature signature(int index, Parameter parameter) {
// 		String name = parameter.getName();
// 		Class<?> type = parameter.getType();
// 		return new ParameterSignature(index, name, type);
// 	}
// 
// 	public static List<ParameterSignature> signatures(Method method) {
// 		Parameter[] parameters = method.getParameters();
// 		List<ParameterSignature> signatures = new ArrayList<>(parameters.length);
// 
// 		for (int i = 0; i < parameters.length; i++) {
// 			Parameter parameter = parameters[i];
// 			signatures.add(signature(i, parameter));
// 		}
// 
// 		return signatures;
// 	}
// 
// 	public int getIndex() {
// 		return index;
// 	}
// 
// 	public String getName() {
// 		return name;
// 	}
// 
// 	public Class<?> getType() {
// 		return type;
// 	}
// 
// 	public ParameterValue value(Object value) {
// 		return new ParameterValue(value, this);
// 	}
// }
// 
// Path: spring-influxdb-orm/src/main/java/com/vgerbot/orm/influxdb/param/ParameterValue.java
// public class ParameterValue {
// 	private final Object value;
// 	private final ParameterSignature signature;
// 
// 	public ParameterValue(Object value, ParameterSignature signature) {
// 		super();
// 		this.value = value;
// 		this.signature = signature;
// 	}
// 
// 	public Object getValue() {
// 		return value;
// 	}
// 
// 	public ParameterSignature getSignature() {
// 		return signature;
// 	}
// 
// }
// 
// Path: spring-influxdb-orm/src/main/java/com/vgerbot/orm/influxdb/utils/CommandUtils.java
// public class CommandUtils {
// 	public static String parseCommand(String command, final Map<String, ParameterValue> parameters) {
// 		command = StringUtils.replace(command, "\\$\\{([^\\}]+)\\}", 1, new ReplaceCallback() {
// 			@Override
// 			public String replace(String word, int index, String source) {
// 				ParameterValue parameterValue = parameters.get(word);
// 				if (parameterValue == null || parameterValue.getValue() == null) {
// 					return "";
// 				}
// 				Object value = parameterValue.getValue();
// 				return value.toString();
// 			}
// 		});
// 		command = StringUtils.replace(command, "\\#\\{([^\\}]+)\\}", 1, new ReplaceCallback() {
// 			@Override
// 			public String replace(String word, int index, String source) {
// 				ParameterValue parameterValue = parameters.get(word);
// 				if (parameterValue == null) {
// 					return "";
// 				}
// 				Object value = parameterValue.getValue();
// 				if (value == null) {
// 					return "null";
// 				}
// 				Class<?> type = parameterValue.getSignature().getType();
// 				if (CharSequence.class.isAssignableFrom(type)) {
// 					return "'" + value + "'";
// 				} else if (Date.class.isInstance(value)) {
// 					return Long.toString(TimeUnit.MILLISECONDS.toNanos(((Date) value).getTime()), 10);
// 				}
// 				return value.toString();
// 			}
// 		});
// 		return command;
// 	}
// }


// Path: spring-influxdb-orm/src/test/java/com/vgerbot/test/orm/influxdb/utils/CommandUtilsTest.java
import com.vgerbot.orm.influxdb.param.ParameterSignature;
import com.vgerbot.orm.influxdb.param.ParameterValue;
import com.vgerbot.orm.influxdb.utils.CommandUtils;
import org.junit.Test;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
import java.time.Instant;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import static org.mockito.Mockito.*;

        assertThat(parsedCommand, equalTo("select * from table_name where nickname="));
    }
    @Test
    public void shouldReplaceToEmptyStringIfValueOfPlaceholderIsNull() {
        String parsedCommand = CommandUtils.parseCommand("select * from table_name where nv=${null-value}", parameterValues);
        assertThat(parsedCommand, equalTo("select * from table_name where nv="));
    }
    @Test
    public void shouldReplacePlaceholdersCorrect() {
        String parsedCommand = CommandUtils.parseCommand("select * from table_name where nv=${nickname} and age=${age}", parameterValues);
        assertThat(parsedCommand, equalTo("select * from table_name where nv=mario and age=18"));
    }

    @Test
    public void shouldReplaceCharSequenceRawValueToStringWithAPairOfQuotes() {
        String parsedCommand = CommandUtils.parseCommand("select * from table_name where nv=#{nickname}", parameterValues);
        assertThat(parsedCommand, equalTo("select * from table_name where nv='mario'"));
    }
    @Test
    public void shouldReplaceDateObjectToNanosNumeric() {
        String parsedCommand = CommandUtils.parseCommand("#{birthday}", parameterValues);
        assertThat(parsedCommand, equalTo(Long.toString(TimeUnit.MILLISECONDS.toNanos(CONST_BIRTHDAY.getTime()),10)));
    }

    private static <T> Parameter createParameter(String name, Class<T> type) {
        Parameter parameter = mock(Parameter.class);
        when(parameter.getName()).thenReturn(name);
        when((Object)parameter.getType()).thenReturn((Object)type);
        return parameter;
    }
    private static <T> ParameterValue createParameterValue(String name, Class<T> type, T value) {