// Path: src/main/java/net/kimleo/rec/sepval/SepValEntry.java
// public class SepValEntry implements Accessible<String> {
// 
//     private final List<String> values;
//     private final String source;
// 
//     public SepValEntry(List<String> values, String source) {
//         this.values = values;
//         this.source = source;
//     }
// 
//     @Override
//     public String get(int index) {
//         return values.get(index);
//     }
// 
//     @Override
//     public int size() {
//         return values.size();
//     }
// 
//     public List<String> getValues() {
//         return values;
//     }
// 
//     public String getSource() {
//         return source;
//     }
// }
// 
// Path: src/main/java/net/kimleo/rec/sepval/parser/SimpleParser.java
// public class SimpleParser {
//     private final ParseConfig config;
// 
//     private final static Logger LOGGER = LoggerFactory.getLogger(SimpleParser.class);
// 
//     public SimpleParser(ParseConfig config) {
//         this.config = config;
//     }
// 
//     public SimpleParser() {
//         this(ParseConfig.DEFAULT);
//     }
// 
//     public SepValEntry parse(String input) {
//         ParseState state = new ParseState(input);
//         ArrayList<String> fields = new ArrayList<>();
//         while (!state.eof()) {
//             fields.add(parseField(state));
//         }
// 
//         if (state.of(state.getSize() - 1) == config.delimiter) {
//             LOGGER.warn(String.format("Found delimiter [%s] at end of record", config.delimiter));
//             fields.add("");
//         }
// 
//         return new SepValEntry(fields, input);
//     }
// 
//     private String parseField(ParseState state) {
//         StringBuilder builder = new StringBuilder();
//         Character c = state.current();
//         while (c != null && c != config.delimiter) {
//             if (builder.length() == 0) {
//                 if (isSpace(c)) {
//                     c = state.next();
//                     continue;
//                 }
//                 if (c == config.escape) {
//                     return parseEscaped(state);
//                 }
//             }
//             builder.append(c);
//             c = state.next();
//         }
//         state.next();
//         return builder.toString().trim();
//     }
// 
//     private String parseEscaped(ParseState state) {
// 
//         StringBuilder builder = new StringBuilder();
//         assert (state.current() == config.escape);
// 
//         Character c = state.next();
//         while (!state.eof() || c != config.delimiter) {
//             if (c == config.escape) {
//                 c = state.next();
//                 if (c == null || c != config.escape) {
//                     expectDelimiter(state);
//                     state.next();
//                     break;
//                 }
//             }
//             builder.append(c);
//             c = state.next();
//         }
//         return builder.toString();
//     }
// 
//     private void expectDelimiter(ParseState state) {
//         while (isSpace(state.current())) {
//             state.next();
//         }
// 
//         assert((state.current() == null || state.current() == config.delimiter));
//     }
// 
//     private boolean isSpace(Character c) {
//         return c != null && (c == ' ' || c == '\t');
//     }
// }
// 
// Path: src/main/java/net/kimleo/rec/v2/accessor/Accessor.java
// public class Accessor<T> {
// 
//     private final Map<String, Integer> fieldMap;
//     private final Integer leastCapacity;
// 
//     public Accessor(String[] fields) {
//         Pair<Map<String, Integer>, Integer> fieldMapPair = Lexer.buildFieldMapPair(fields);
//         fieldMap = fieldMapPair.getFirst();
//         leastCapacity = fieldMapPair.getSecond();
//     }
// 
//     public Map<String, Integer> getFieldMap() {
//         return fieldMap;
//     }
// 
//     public Integer getLeastCapacity() {
//         return leastCapacity;
//     }
// 
//     public RecordWrapper<T> create(Accessible<T> record) {
//         assertTrue (record.size() >= leastCapacity);
// 
//         return new RecordWrapper<>(fieldMap, record);
//     }
// 
//     public RecordWrapper<T> of(Accessible<T> record) {
//         return create(record);
//     }
// }
// 
// Path: src/main/java/net/kimleo/rec/v2/accessor/RecordWrapper.java
// public class RecordWrapper<T> implements Accessible<T>, Mapped<T> {
// 
//     private final Map<String, Integer> fieldNames;
// 
//     private final Accessible<T> record;
// 
//     public RecordWrapper(Map<String, Integer> fieldNames, Accessible<T> record) {
//         this.fieldNames = fieldNames;
//         this.record = record;
//     }
// 
//     @Override
//     public T get(int index) {
//         return getByIndex(index, record);
//     }
// 
//     @Override
//     public int size() {
//         return record.size();
//     }
// 
//     @Override
//     public T get(String field) {
//         if (fieldNames.containsKey(field)) {
//             return getByIndex(fieldNames.get(field), record);
//         }
//         return null;
//     }
// 
//     private T getByIndex(Integer index, Accessible<T> record) {
//         if (index >= 0) {
//             return record.get(index);
//         } else {
//             return record.get(record.size() + index);
//         }
//     }
// 
//     @Override
//     public List<String> keys() {
//         return fieldNames.keySet().stream().collect(Collectors.toList());
//     }
// 
//     @Override
//     public String toString() {
//         return record.toString();
//     }
// }


import net.kimleo.rec.sepval.SepValEntry;
import net.kimleo.rec.sepval.parser.SimpleParser;
import net.kimleo.rec.v2.accessor.Accessor;
import net.kimleo.rec.v2.accessor.RecordWrapper;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
package net.kimleo.rec.v2.issue;




// See https://github.com/rec-framework/rec-core/issues/36
public class Issue36Test {

    private final SimpleParser parser = new SimpleParser();

    @Test
    public void shouldOriginallyPass() throws Exception {

// Path: src/main/java/net/kimleo/rec/sepval/SepValEntry.java
// public class SepValEntry implements Accessible<String> {
// 
//     private final List<String> values;
//     private final String source;
// 
//     public SepValEntry(List<String> values, String source) {
//         this.values = values;
//         this.source = source;
//     }
// 
//     @Override
//     public String get(int index) {
//         return values.get(index);
//     }
// 
//     @Override
//     public int size() {
//         return values.size();
//     }
// 
//     public List<String> getValues() {
//         return values;
//     }
// 
//     public String getSource() {
//         return source;
//     }
// }
// 
// Path: src/main/java/net/kimleo/rec/sepval/parser/SimpleParser.java
// public class SimpleParser {
//     private final ParseConfig config;
// 
//     private final static Logger LOGGER = LoggerFactory.getLogger(SimpleParser.class);
// 
//     public SimpleParser(ParseConfig config) {
//         this.config = config;
//     }
// 
//     public SimpleParser() {
//         this(ParseConfig.DEFAULT);
//     }
// 
//     public SepValEntry parse(String input) {
//         ParseState state = new ParseState(input);
//         ArrayList<String> fields = new ArrayList<>();
//         while (!state.eof()) {
//             fields.add(parseField(state));
//         }
// 
//         if (state.of(state.getSize() - 1) == config.delimiter) {
//             LOGGER.warn(String.format("Found delimiter [%s] at end of record", config.delimiter));
//             fields.add("");
//         }
// 
//         return new SepValEntry(fields, input);
//     }
// 
//     private String parseField(ParseState state) {
//         StringBuilder builder = new StringBuilder();
//         Character c = state.current();
//         while (c != null && c != config.delimiter) {
//             if (builder.length() == 0) {
//                 if (isSpace(c)) {
//                     c = state.next();
//                     continue;
//                 }
//                 if (c == config.escape) {
//                     return parseEscaped(state);
//                 }
//             }
//             builder.append(c);
//             c = state.next();
//         }
//         state.next();
//         return builder.toString().trim();
//     }
// 
//     private String parseEscaped(ParseState state) {
// 
//         StringBuilder builder = new StringBuilder();
//         assert (state.current() == config.escape);
// 
//         Character c = state.next();
//         while (!state.eof() || c != config.delimiter) {
//             if (c == config.escape) {
//                 c = state.next();
//                 if (c == null || c != config.escape) {
//                     expectDelimiter(state);
//                     state.next();
//                     break;
//                 }
//             }
//             builder.append(c);
//             c = state.next();
//         }
//         return builder.toString();
//     }
// 
//     private void expectDelimiter(ParseState state) {
//         while (isSpace(state.current())) {
//             state.next();
//         }
// 
//         assert((state.current() == null || state.current() == config.delimiter));
//     }
// 
//     private boolean isSpace(Character c) {
//         return c != null && (c == ' ' || c == '\t');
//     }
// }
// 
// Path: src/main/java/net/kimleo/rec/v2/accessor/Accessor.java
// public class Accessor<T> {
// 
//     private final Map<String, Integer> fieldMap;
//     private final Integer leastCapacity;
// 
//     public Accessor(String[] fields) {
//         Pair<Map<String, Integer>, Integer> fieldMapPair = Lexer.buildFieldMapPair(fields);
//         fieldMap = fieldMapPair.getFirst();
//         leastCapacity = fieldMapPair.getSecond();
//     }
// 
//     public Map<String, Integer> getFieldMap() {
//         return fieldMap;
//     }
// 
//     public Integer getLeastCapacity() {
//         return leastCapacity;
//     }
// 
//     public RecordWrapper<T> create(Accessible<T> record) {
//         assertTrue (record.size() >= leastCapacity);
// 
//         return new RecordWrapper<>(fieldMap, record);
//     }
// 
//     public RecordWrapper<T> of(Accessible<T> record) {
//         return create(record);
//     }
// }
// 
// Path: src/main/java/net/kimleo/rec/v2/accessor/RecordWrapper.java
// public class RecordWrapper<T> implements Accessible<T>, Mapped<T> {
// 
//     private final Map<String, Integer> fieldNames;
// 
//     private final Accessible<T> record;
// 
//     public RecordWrapper(Map<String, Integer> fieldNames, Accessible<T> record) {
//         this.fieldNames = fieldNames;
//         this.record = record;
//     }
// 
//     @Override
//     public T get(int index) {
//         return getByIndex(index, record);
//     }
// 
//     @Override
//     public int size() {
//         return record.size();
//     }
// 
//     @Override
//     public T get(String field) {
//         if (fieldNames.containsKey(field)) {
//             return getByIndex(fieldNames.get(field), record);
//         }
//         return null;
//     }
// 
//     private T getByIndex(Integer index, Accessible<T> record) {
//         if (index >= 0) {
//             return record.get(index);
//         } else {
//             return record.get(record.size() + index);
//         }
//     }
// 
//     @Override
//     public List<String> keys() {
//         return fieldNames.keySet().stream().collect(Collectors.toList());
//     }
// 
//     @Override
//     public String toString() {
//         return record.toString();
//     }
// }


// Path: src/test/java/net/kimleo/rec/v2/issue/Issue36Test.java
import net.kimleo.rec.sepval.SepValEntry;
import net.kimleo.rec.sepval.parser.SimpleParser;
import net.kimleo.rec.v2.accessor.Accessor;
import net.kimleo.rec.v2.accessor.RecordWrapper;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

package net.kimleo.rec.v2.issue;




// See https://github.com/rec-framework/rec-core/issues/36
public class Issue36Test {

    private final SimpleParser parser = new SimpleParser();

    @Test
    public void shouldOriginallyPass() throws Exception {

        SepValEntry entry = parser.parse("1, 2, 3, 4, 5,,,,123");