// Path: core/src/main/java/io/appflate/restmock/utils/QueryParam.java
// public class QueryParam {
// 
//     private final String key;
//     private final List<String> values;
// 
//     public QueryParam(String key, List<String> values) {
//         this.key = key;
//         this.values = values;
//     }
// 
//     public QueryParam(String key, String... values) {
//         this.key = key;
//         this.values = new LinkedList<>();
// 
//         for (String val : values) {
//             this.values.add(val);
//         }
//     }
// 
//     @Override
//     public boolean equals(Object other) {
//         if (!(other instanceof QueryParam)) {
//             return false;
//         }
// 
//         QueryParam otherQueryParam = (QueryParam) other;
// 
//         if (this == other) {
//             return true;
//         }
// 
//         if (!this.key.equals(otherQueryParam.key)) {
//             return false;
//         }
// 
//         if (this.values.size() != otherQueryParam.values.size()) {
//             return false;
//         }
// 
//         for (String nextVal : this.values) {
//             if (!otherQueryParam.values.contains(nextVal)) {
//                 return false;
//             }
//         }
// 
//         return true;
//     }
// 
//     @Override
//     public int hashCode() {
//         int result = 17;
//         result = 37 * result + (key == null ? 0 : key.hashCode());
//         result = 37 * result + (values == null ? 0 : values.hashCode());
// 
//         return result;
//     }
// 
//     public String getKey() {
//         return this.key;
//     }
// 
//     public List<String> getValues() {
//         return this.values;
//     }
// }
// 
// Path: core/src/main/java/io/appflate/restmock/utils/RestMockUtils.java
// public final class RestMockUtils {
// 
//     public static MockResponse createResponseFromFile(RESTMockFileParser RESTMockFileParser, String jsonFilePath,
//                                                       int responseCode) throws Exception {
//         String fileContents = RESTMockFileParser.readJsonFile(jsonFilePath);
//         return new MockResponse().setResponseCode(responseCode).setBody(fileContents);
//     }
// 
//     /**
//      * Extract query parameters from a {@link URL}.
//      *
//      * @param url The {@link URL} to retrieve query parameters for.
//      * @return A {@link List} of {@link QueryParam} objects. Each parameter has one key, and zero or
//      * more values.
//      * @throws UnsupportedEncodingException If unable to decode from UTF-8. This should never happen.
//      */
//     public static List<QueryParam> splitQuery(URL url) throws UnsupportedEncodingException {
//         final Map<String, List<String>> queryPairs = new LinkedHashMap<>();
// 
//         String query = url.getQuery();
//         if (query == null || query.trim().length() == 0) {
//             return Collections.emptyList();
//         }
// 
//         final String[] pairs = query.split("&");
//         for (String pair : pairs) {
//             final int idx = pair.indexOf("=");
//             final String key = idx > 0 ? URLDecoder.decode(pair.substring(0, idx), "UTF-8") : pair;
//             List<String> valueList = new LinkedList<>();
// 
//             if (queryPairs.containsKey(key)) {
//                 valueList = queryPairs.get(key);
//             }
// 
//             final String value = idx > 0 && pair.length() > idx + 1 ? URLDecoder.decode(pair.substring(idx + 1), "UTF-8") : null;
//             valueList.add(value);
// 
//             queryPairs.put(key, valueList);
//         }
// 
//         List<QueryParam> finalParamList = new LinkedList<>();
//         for (Map.Entry<String, List<String>> entry : queryPairs.entrySet()) {
//             QueryParam nextFinalParam = new QueryParam(entry.getKey(), entry.getValue());
//             finalParamList.add(nextFinalParam);
//         }
// 
//         return finalParamList;
//     }
// 
//     private RestMockUtils() {
//         throw new UnsupportedOperationException("(╯‵Д′)╯ PLEASE STAHP!");
// 
//     }
// }


import org.junit.Test;
import java.net.URL;
import java.util.List;
import io.appflate.restmock.utils.QueryParam;
import io.appflate.restmock.utils.RestMockUtils;
import static junit.framework.TestCase.assertTrue;
import static org.junit.Assert.assertEquals;
package io.appflate.restmock;





public class QueryParamTest {

    @Test
    public void testBasicQueryParamSplit() throws Exception {
        URL url = new URL("https://www.jwir3.com/someRequest?flag=true&session_length=2");

// Path: core/src/main/java/io/appflate/restmock/utils/QueryParam.java
// public class QueryParam {
// 
//     private final String key;
//     private final List<String> values;
// 
//     public QueryParam(String key, List<String> values) {
//         this.key = key;
//         this.values = values;
//     }
// 
//     public QueryParam(String key, String... values) {
//         this.key = key;
//         this.values = new LinkedList<>();
// 
//         for (String val : values) {
//             this.values.add(val);
//         }
//     }
// 
//     @Override
//     public boolean equals(Object other) {
//         if (!(other instanceof QueryParam)) {
//             return false;
//         }
// 
//         QueryParam otherQueryParam = (QueryParam) other;
// 
//         if (this == other) {
//             return true;
//         }
// 
//         if (!this.key.equals(otherQueryParam.key)) {
//             return false;
//         }
// 
//         if (this.values.size() != otherQueryParam.values.size()) {
//             return false;
//         }
// 
//         for (String nextVal : this.values) {
//             if (!otherQueryParam.values.contains(nextVal)) {
//                 return false;
//             }
//         }
// 
//         return true;
//     }
// 
//     @Override
//     public int hashCode() {
//         int result = 17;
//         result = 37 * result + (key == null ? 0 : key.hashCode());
//         result = 37 * result + (values == null ? 0 : values.hashCode());
// 
//         return result;
//     }
// 
//     public String getKey() {
//         return this.key;
//     }
// 
//     public List<String> getValues() {
//         return this.values;
//     }
// }
// 
// Path: core/src/main/java/io/appflate/restmock/utils/RestMockUtils.java
// public final class RestMockUtils {
// 
//     public static MockResponse createResponseFromFile(RESTMockFileParser RESTMockFileParser, String jsonFilePath,
//                                                       int responseCode) throws Exception {
//         String fileContents = RESTMockFileParser.readJsonFile(jsonFilePath);
//         return new MockResponse().setResponseCode(responseCode).setBody(fileContents);
//     }
// 
//     /**
//      * Extract query parameters from a {@link URL}.
//      *
//      * @param url The {@link URL} to retrieve query parameters for.
//      * @return A {@link List} of {@link QueryParam} objects. Each parameter has one key, and zero or
//      * more values.
//      * @throws UnsupportedEncodingException If unable to decode from UTF-8. This should never happen.
//      */
//     public static List<QueryParam> splitQuery(URL url) throws UnsupportedEncodingException {
//         final Map<String, List<String>> queryPairs = new LinkedHashMap<>();
// 
//         String query = url.getQuery();
//         if (query == null || query.trim().length() == 0) {
//             return Collections.emptyList();
//         }
// 
//         final String[] pairs = query.split("&");
//         for (String pair : pairs) {
//             final int idx = pair.indexOf("=");
//             final String key = idx > 0 ? URLDecoder.decode(pair.substring(0, idx), "UTF-8") : pair;
//             List<String> valueList = new LinkedList<>();
// 
//             if (queryPairs.containsKey(key)) {
//                 valueList = queryPairs.get(key);
//             }
// 
//             final String value = idx > 0 && pair.length() > idx + 1 ? URLDecoder.decode(pair.substring(idx + 1), "UTF-8") : null;
//             valueList.add(value);
// 
//             queryPairs.put(key, valueList);
//         }
// 
//         List<QueryParam> finalParamList = new LinkedList<>();
//         for (Map.Entry<String, List<String>> entry : queryPairs.entrySet()) {
//             QueryParam nextFinalParam = new QueryParam(entry.getKey(), entry.getValue());
//             finalParamList.add(nextFinalParam);
//         }
// 
//         return finalParamList;
//     }
// 
//     private RestMockUtils() {
//         throw new UnsupportedOperationException("(╯‵Д′)╯ PLEASE STAHP!");
// 
//     }
// }


// Path: core/src/test/java/io/appflate/restmock/QueryParamTest.java
import org.junit.Test;
import java.net.URL;
import java.util.List;
import io.appflate.restmock.utils.QueryParam;
import io.appflate.restmock.utils.RestMockUtils;
import static junit.framework.TestCase.assertTrue;
import static org.junit.Assert.assertEquals;

package io.appflate.restmock;





public class QueryParamTest {

    @Test
    public void testBasicQueryParamSplit() throws Exception {
        URL url = new URL("https://www.jwir3.com/someRequest?flag=true&session_length=2");

        List<QueryParam> params = RestMockUtils.splitQuery(url);