// Path: src/main/java/com/github/jankroken/commandline/domain/internal/LongOrCompactTokenizer.java
// public class LongOrCompactTokenizer implements Tokenizer {
// 
//     private static final Pattern SWITCH_PATTERN = Pattern.compile("-.*");
//     private static final Pattern LONG_STYLE_SWITCH_PATTERN = Pattern.compile("--..*");
//     private static final Pattern SHORT_STYLE_SWITCH_PATTERN = Pattern.compile("-[^-].*");
//     private final PeekIterator<String> stringIterator;
//     private boolean argumentEscapeEncountered;
//     private String argumentTerminator;
//     private final LinkedList<SwitchToken> splitTokens = new LinkedList<>();
// 
//     public LongOrCompactTokenizer(final PeekIterator<String> stringIterator) {
//         this.stringIterator = stringIterator;
//     }
// 
//     public void setArgumentTerminator(String argumentTerminator) {
//         this.argumentTerminator = argumentTerminator;
//     }
// 
//     public boolean hasNext() {
//         return stringIterator.hasNext();
//     }
// 
//     // this is a mess - need to be cleaned up
//     public Token peek() {
//         if (!splitTokens.isEmpty()) {
//             return splitTokens.peek();
//         }
//         final var value = stringIterator.peek();
// 
//         if (argumentEscapeEncountered) {
//             return new ArgumentToken(value);
//         }
// 
//         if (Objects.equals(value, argumentTerminator)) {
//             return new ArgumentToken(value);
//         }
//         if (argumentTerminator != null) {
//             return new ArgumentToken(value);
//         }
//         if (isArgumentEscape(value)) {
//             argumentEscapeEncountered = true;
//             return peek();
//         }
//         if (isSwitch(value)) {
//             if (isShortSwitchList(value)) {
//                 var tokens = splitSwitchTokens(value);
//                 return tokens.get(0);
//             } else {
//                 return new SwitchToken(value.substring(2), value);
//             }
//         } else {
//             return new ArgumentToken(value);
//         }
//     }
// 
//     // this is a mess - needs to be cleaned up
//     public Token next() {
//         if (!splitTokens.isEmpty()) {
//             return splitTokens.remove();
//         }
//         var value = stringIterator.next();
// 
//         if (argumentEscapeEncountered) {
//             return new ArgumentToken(value);
//         }
// 
//         if (Objects.equals(value, argumentTerminator)) {
//             argumentTerminator = null;
//             return new ArgumentToken(value);
//         }
//         if (argumentTerminator != null) {
//             return new ArgumentToken(value);
//         }
//         if (isArgumentEscape(value)) {
//             argumentEscapeEncountered = true;
//             return next();
//         }
//         if (isSwitch(value)) {
//             if (isShortSwitchList(value)) {
//                 splitTokens.addAll(splitSwitchTokens(value));
//                 return splitTokens.remove();
//             } else {
//                 return new SwitchToken(value.substring(2), value);
//             }
//         } else {
//             return new ArgumentToken(value);
//         }
//     }
// 
//     public void remove() {
//         stringIterator.remove();
//     }
// 
//     private static boolean isSwitch(final String argument) {
//         return SWITCH_PATTERN.matcher(argument).matches();
//     }
// 
//     private boolean isArgumentEscape(final String value) {
//         return ("--".equals(value) && !argumentEscapeEncountered);
//     }
// 
//     private boolean isLongSwitch(final String value) {
//         return LONG_STYLE_SWITCH_PATTERN.matcher(value).matches();
//     }
// 
//     private boolean isShortSwitchList(final String value) {
//         return SHORT_STYLE_SWITCH_PATTERN.matcher(value).matches();
//     }
// 
//     private List<SwitchToken> splitSwitchTokens(final String value) {
//         final var tokens = new ArrayList<SwitchToken>();
//         for (var i = 1; i < value.length(); i++) {
//             tokens.add(new SwitchToken(String.valueOf(value.charAt(i)), value));
//         }
//         return tokens;
//     }
// 
// }
// 
// Path: src/main/java/com/github/jankroken/commandline/util/ArrayIterator.java
// public class ArrayIterator<T> implements Iterator<T> {
// 
//     private final T[] array;
//     private int index = 0;
// 
//     public ArrayIterator(T[] array) {
//         this.array = array;
//     }
// 
//     public boolean hasNext() {
//         return array.length > index;
//     }
// 
//     public T next() {
//         if (array.length > index) {
//             return array[index++];
//         } else {
//             throw new NoSuchElementException();
//         }
//     }
// 
//     public T peek() {
//         if (array.length > index) {
//             return array[index];
//         } else {
//             throw new NoSuchElementException();
//         }
//     }
// 
//     public void remove() {
//         throw new UnsupportedOperationException();
//     }
// }
// 
// Path: src/main/java/com/github/jankroken/commandline/util/PeekIterator.java
// public class PeekIterator<T> implements Iterator<T> {
// 
//     private T nextValue;
//     private final Iterator<T> iterator;
// 
//     public PeekIterator(Iterator<T> iterator) {
//         this.iterator = iterator;
//     }
// 
//     public boolean hasNext() {
//         return nextValue != null || iterator.hasNext();
//     }
// 
//     public T next() {
//         if (nextValue != null) {
//             var value = nextValue;
//             nextValue = null;
//             return value;
//         } else {
//             return iterator.next();
//         }
//     }
// 
//     public T peek() {
//         if (nextValue == null) {
//             nextValue = iterator.next();
//         }
//         return nextValue;
//     }
// 
//     public void remove() {
//         throw new UnsupportedOperationException();
//     }
// 
// }


import com.github.jankroken.commandline.domain.internal.LongOrCompactTokenizer;
import com.github.jankroken.commandline.util.ArrayIterator;
import com.github.jankroken.commandline.util.PeekIterator;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
package com.github.jankroken.commandline.domain;



public class LongOrCompactTokenizerTest {

    @Test
    public void simpleArgumentSplit() {
        final var args = new String[]{"-abcf", "hello.txt"};
// Path: src/main/java/com/github/jankroken/commandline/domain/internal/LongOrCompactTokenizer.java
// public class LongOrCompactTokenizer implements Tokenizer {
// 
//     private static final Pattern SWITCH_PATTERN = Pattern.compile("-.*");
//     private static final Pattern LONG_STYLE_SWITCH_PATTERN = Pattern.compile("--..*");
//     private static final Pattern SHORT_STYLE_SWITCH_PATTERN = Pattern.compile("-[^-].*");
//     private final PeekIterator<String> stringIterator;
//     private boolean argumentEscapeEncountered;
//     private String argumentTerminator;
//     private final LinkedList<SwitchToken> splitTokens = new LinkedList<>();
// 
//     public LongOrCompactTokenizer(final PeekIterator<String> stringIterator) {
//         this.stringIterator = stringIterator;
//     }
// 
//     public void setArgumentTerminator(String argumentTerminator) {
//         this.argumentTerminator = argumentTerminator;
//     }
// 
//     public boolean hasNext() {
//         return stringIterator.hasNext();
//     }
// 
//     // this is a mess - need to be cleaned up
//     public Token peek() {
//         if (!splitTokens.isEmpty()) {
//             return splitTokens.peek();
//         }
//         final var value = stringIterator.peek();
// 
//         if (argumentEscapeEncountered) {
//             return new ArgumentToken(value);
//         }
// 
//         if (Objects.equals(value, argumentTerminator)) {
//             return new ArgumentToken(value);
//         }
//         if (argumentTerminator != null) {
//             return new ArgumentToken(value);
//         }
//         if (isArgumentEscape(value)) {
//             argumentEscapeEncountered = true;
//             return peek();
//         }
//         if (isSwitch(value)) {
//             if (isShortSwitchList(value)) {
//                 var tokens = splitSwitchTokens(value);
//                 return tokens.get(0);
//             } else {
//                 return new SwitchToken(value.substring(2), value);
//             }
//         } else {
//             return new ArgumentToken(value);
//         }
//     }
// 
//     // this is a mess - needs to be cleaned up
//     public Token next() {
//         if (!splitTokens.isEmpty()) {
//             return splitTokens.remove();
//         }
//         var value = stringIterator.next();
// 
//         if (argumentEscapeEncountered) {
//             return new ArgumentToken(value);
//         }
// 
//         if (Objects.equals(value, argumentTerminator)) {
//             argumentTerminator = null;
//             return new ArgumentToken(value);
//         }
//         if (argumentTerminator != null) {
//             return new ArgumentToken(value);
//         }
//         if (isArgumentEscape(value)) {
//             argumentEscapeEncountered = true;
//             return next();
//         }
//         if (isSwitch(value)) {
//             if (isShortSwitchList(value)) {
//                 splitTokens.addAll(splitSwitchTokens(value));
//                 return splitTokens.remove();
//             } else {
//                 return new SwitchToken(value.substring(2), value);
//             }
//         } else {
//             return new ArgumentToken(value);
//         }
//     }
// 
//     public void remove() {
//         stringIterator.remove();
//     }
// 
//     private static boolean isSwitch(final String argument) {
//         return SWITCH_PATTERN.matcher(argument).matches();
//     }
// 
//     private boolean isArgumentEscape(final String value) {
//         return ("--".equals(value) && !argumentEscapeEncountered);
//     }
// 
//     private boolean isLongSwitch(final String value) {
//         return LONG_STYLE_SWITCH_PATTERN.matcher(value).matches();
//     }
// 
//     private boolean isShortSwitchList(final String value) {
//         return SHORT_STYLE_SWITCH_PATTERN.matcher(value).matches();
//     }
// 
//     private List<SwitchToken> splitSwitchTokens(final String value) {
//         final var tokens = new ArrayList<SwitchToken>();
//         for (var i = 1; i < value.length(); i++) {
//             tokens.add(new SwitchToken(String.valueOf(value.charAt(i)), value));
//         }
//         return tokens;
//     }
// 
// }
// 
// Path: src/main/java/com/github/jankroken/commandline/util/ArrayIterator.java
// public class ArrayIterator<T> implements Iterator<T> {
// 
//     private final T[] array;
//     private int index = 0;
// 
//     public ArrayIterator(T[] array) {
//         this.array = array;
//     }
// 
//     public boolean hasNext() {
//         return array.length > index;
//     }
// 
//     public T next() {
//         if (array.length > index) {
//             return array[index++];
//         } else {
//             throw new NoSuchElementException();
//         }
//     }
// 
//     public T peek() {
//         if (array.length > index) {
//             return array[index];
//         } else {
//             throw new NoSuchElementException();
//         }
//     }
// 
//     public void remove() {
//         throw new UnsupportedOperationException();
//     }
// }
// 
// Path: src/main/java/com/github/jankroken/commandline/util/PeekIterator.java
// public class PeekIterator<T> implements Iterator<T> {
// 
//     private T nextValue;
//     private final Iterator<T> iterator;
// 
//     public PeekIterator(Iterator<T> iterator) {
//         this.iterator = iterator;
//     }
// 
//     public boolean hasNext() {
//         return nextValue != null || iterator.hasNext();
//     }
// 
//     public T next() {
//         if (nextValue != null) {
//             var value = nextValue;
//             nextValue = null;
//             return value;
//         } else {
//             return iterator.next();
//         }
//     }
// 
//     public T peek() {
//         if (nextValue == null) {
//             nextValue = iterator.next();
//         }
//         return nextValue;
//     }
// 
//     public void remove() {
//         throw new UnsupportedOperationException();
//     }
// 
// }


// Path: src/test/java/com/github/jankroken/commandline/domain/LongOrCompactTokenizerTest.java
import com.github.jankroken.commandline.domain.internal.LongOrCompactTokenizer;
import com.github.jankroken.commandline.util.ArrayIterator;
import com.github.jankroken.commandline.util.PeekIterator;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;

package com.github.jankroken.commandline.domain;



public class LongOrCompactTokenizerTest {

    @Test
    public void simpleArgumentSplit() {
        final var args = new String[]{"-abcf", "hello.txt"};
        final var peekIterator = new PeekIterator<>(new ArrayIterator<>(args));