Add --pad option to optionally add padding symbols at text edges

1       ich     ich     PPER    PPER    _       _       _       _       1
 2       bin     sein    VAFIN   VAFIN   _       _       _       _       1.000000
 3       alex    alex    NE      NE      _       _       _       _       0.565630
 4       .       .       $.      $.      _       _       _       _       1.000000

 # text_id = TST_TST.00001
 1       alex    alex    NE      NE      _       _       _       _       0.565630
 2       bin     sein    VAFIN   VAFIN   _       _       _       _       1.000000
 3       ich     ich     PPER    PPER    _       _       _       _       1
 4       .       .       $.      $.      _       _       _       _       1.000000

 # text_id = TST_TST.00002
 1       ich     ich     PPER    PPER    _       _       _       _       1
 2       heiße   heißen  VAFIN   VAFIN   _       _       _       _       1.000000
 3       alex    alex    NE      NE      _       _       _       _       0.565630
 4       .       .       $.      $.      _       _       _       _       1.000000

---->

.       «END»   «END»   3
«END»   «END»   «END»   3
«START» «START» «START» 3
«START» «START» ich     2
alex    .       «END»   2
«START» «START» alex    1
«START» alex    bin     1
«START» ich     bin     1
«START» ich     heiße   1
alex    bin     ich     1
bin     alex    .       1
bin     ich     .       1
heiße   alex    .       1
ich     .       «END»   1
ich     bin     alex    1
ich     heiße   alex    1

Change-Id: Ib4826400da657787940805c616a0000ac089120d
diff --git a/src/test/java/org/ids_mannheim/WorkerTest.java b/src/test/java/org/ids_mannheim/WorkerTest.java
index c4d8758..5e0623f 100644
--- a/src/test/java/org/ids_mannheim/WorkerTest.java
+++ b/src/test/java/org/ids_mannheim/WorkerTest.java
@@ -6,6 +6,9 @@
 import org.junit.jupiter.api.Test;
 
 import java.io.*;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Map;
 import java.util.Objects;
@@ -13,10 +16,12 @@
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.logging.Logger;
+import java.util.stream.Collectors;
 
 import static org.junit.jupiter.api.Assertions.*;
 
 class WorkerTest {
+    public static final String splitFreqlistRegex = "\\t(?=[0-9]+$)";
     private ByteArrayOutputStream errContent;
     private final PrintStream originalErr = System.err;
     Worker worker;
@@ -68,7 +73,7 @@
                 false,
                 new WorkerNodePool(""),
                 new Progressbar(tempFile.length()),
-                Logger.getLogger(TotalNGrams.class.getSimpleName()));
+                Logger.getLogger(TotalNGrams.class.getSimpleName()), false);
 
         queue.add(0);
         queue.add(-1);
@@ -118,7 +123,8 @@
                 true,
                 new WorkerNodePool(""),
                 new Progressbar(tempFile.length()),
-                Logger.getLogger(TotalNGrams.class.getSimpleName()));
+                Logger.getLogger(TotalNGrams.class.getSimpleName()),
+                false);
 
         queue.add(0);
         queue.add(-1);
@@ -163,7 +169,8 @@
                 false,
                 new WorkerNodePool(""),
                 new Progressbar(tempFile.length()),
-                Logger.getLogger(TotalNGrams.class.getSimpleName()));
+                Logger.getLogger(TotalNGrams.class.getSimpleName()),
+                false);
 
         queue.add(0);
         queue.add(-1);
@@ -208,7 +215,8 @@
                 false,
                 new WorkerNodePool(""),
                 new Progressbar(tempFile.length()),
-                Logger.getLogger(TotalNGrams.class.getSimpleName()));
+                Logger.getLogger(TotalNGrams.class.getSimpleName()),
+                false);
 
         queue.add(0);
         queue.add(-1);
@@ -216,4 +224,53 @@
         gold.forEach((key, value) -> assertEquals(value, map.get(key).intValue()));
     }
 
+    @Test
+    void paddingWorks() throws IOException {
+        File tempFile = File.createTempFile("simple", ".conllu");
+        tempFile.deleteOnExit();
+        try (FileOutputStream out = new FileOutputStream(tempFile)) {
+            IOUtils.copy(Objects.requireNonNull(Thread.currentThread().getContextClassLoader()
+                    .getResourceAsStream("simple.conllu")), out);
+        }
+
+        for (boolean with_lemma_and_pos : new boolean[]{false, true}) {
+            for (int n = 1; n <= 3; n++) {
+                ArrayList<String> fnames = new ArrayList<>();
+                fnames.add(tempFile.getAbsolutePath());
+
+                File tempFreqFile = File.createTempFile("simple", ".freq");
+                tempFreqFile.deleteOnExit();
+                try (FileOutputStream out = new FileOutputStream(tempFreqFile)) {
+                    IOUtils.copy(Objects.requireNonNull(Thread.currentThread().getContextClassLoader()
+                            .getResourceAsStream("simple_" + n + (with_lemma_and_pos ? "lp" : "") + "gram_padded.freq")), out);
+                }
+
+                Path path = FileSystems.getDefault().getPath(tempFreqFile.getAbsolutePath());
+                Map<String, Integer> gold = Files.lines(path)
+                        .filter(s -> s.matches(splitFreqlistRegex))
+                        .collect(Collectors.toMap(k -> k.split(splitFreqlistRegex)[0], v -> Integer.parseInt(v.split(splitFreqlistRegex)[1])));
+
+                map = new ConcurrentHashMap<>();
+                LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>(2);
+                worker = new Worker(
+                        queue,
+                        fnames,
+                        n,
+                        1,
+                        1,
+                        map,
+                        with_lemma_and_pos,
+                        false,
+                        new WorkerNodePool(""),
+                        new Progressbar(tempFile.length()),
+                        Logger.getLogger(TotalNGrams.class.getSimpleName()),
+                        true);
+
+                queue.add(0);
+                queue.add(-1);
+                worker.run();
+                gold.forEach((key, value) -> assertEquals(value, map.get(key).intValue()));
+            }
+        }
+    }
 }
diff --git a/src/test/resources/simple.conllu b/src/test/resources/simple.conllu
new file mode 100644
index 0000000..2e52539
--- /dev/null
+++ b/src/test/resources/simple.conllu
@@ -0,0 +1,17 @@
+# text_id = TST_TST.00000
+1	ich	ich	PPER	PPER	_	_	_	_	1
+2	bin	sein	VAFIN	VAFIN	_	_	_	_	1.000000
+3	alex	alex	NE	NE	_	_	_	_	0.565630
+4	.	.	$.	$.	_	_	_	_	1.000000
+
+# text_id = TST_TST.00001
+1	alex	alex	NE	NE	_	_	_	_	0.565630
+2	bin	sein	VAFIN	VAFIN	_	_	_	_	1.000000
+3	ich	ich	PPER	PPER	_	_	_	_	1
+4	.	.	$.	$.	_	_	_	_	1.000000
+
+# text_id = TST_TST.00002
+1	ich	ich	PPER	PPER	_	_	_	_	1
+2	heiße	heißen	VAFIN	VAFIN	_	_	_	_	1.000000
+3	alex	alex	NE	NE	_	_	_	_	0.565630
+4	.	.	$.	$.	_	_	_	_	1.000000
diff --git a/src/test/resources/simple_1gram_padded.freq b/src/test/resources/simple_1gram_padded.freq
new file mode 100644
index 0000000..54522cb
--- /dev/null
+++ b/src/test/resources/simple_1gram_padded.freq
@@ -0,0 +1,7 @@
+.	3
+«END»	3
+«START»	3
+alex	3
+ich	3
+bin	2
+heiße	1
diff --git a/src/test/resources/simple_1lpgram_padded.freq b/src/test/resources/simple_1lpgram_padded.freq
new file mode 100644
index 0000000..ff8c4f7
--- /dev/null
+++ b/src/test/resources/simple_1lpgram_padded.freq
@@ -0,0 +1,7 @@
+.	.	$.	3
+alex	alex	NE	3
+ich	ich	PPER	3
+«END»	«END»	«STARTEND»	3
+«START»	«START»	«STARTEND»	3
+bin	sein	VAFIN	2
+heiße	heißen	VAFIN	1
diff --git a/src/test/resources/simple_2gram_padded.freq b/src/test/resources/simple_2gram_padded.freq
new file mode 100644
index 0000000..ba04a3a
--- /dev/null
+++ b/src/test/resources/simple_2gram_padded.freq
@@ -0,0 +1,13 @@
+.	«END»	3
+«END»	«END»	3
+«START»	«START»	3
+«START»	ich	2
+alex	.	2
+«START»	alex	1
+alex	bin	1
+bin	alex	1
+bin	ich	1
+heiße	alex	1
+ich	.	1
+ich	bin	1
+ich	heiße	1
diff --git a/src/test/resources/simple_2lpgram_padded.freq b/src/test/resources/simple_2lpgram_padded.freq
new file mode 100644
index 0000000..7b1bd84
--- /dev/null
+++ b/src/test/resources/simple_2lpgram_padded.freq
@@ -0,0 +1,13 @@
+.	.	$.	«END»	«END»	«STARTEND»	3
+«END»	«END»	«STARTEND»	«END»	«END»	«STARTEND»	3
+«START»	«START»	«STARTEND»	«START»	«START»	«STARTEND»	3
+alex	alex	NE	.	.	$.	2
+«START»	«START»	«STARTEND»	ich	ich	PPER	2
+alex	alex	NE	bin	sein	VAFIN	1
+bin	sein	VAFIN	alex	alex	NE	1
+bin	sein	VAFIN	ich	ich	PPER	1
+heiße	heißen	VAFIN	alex	alex	NE	1
+ich	ich	PPER	.	.	$.	1
+ich	ich	PPER	bin	sein	VAFIN	1
+ich	ich	PPER	heiße	heißen	VAFIN	1
+«START»	«START»	«STARTEND»	alex	alex	NE	1
diff --git a/src/test/resources/simple_3gram_padded.freq b/src/test/resources/simple_3gram_padded.freq
new file mode 100644
index 0000000..f54eede
--- /dev/null
+++ b/src/test/resources/simple_3gram_padded.freq
@@ -0,0 +1,16 @@
+.	«END»	«END»	3
+«END»	«END»	«END»	3
+«START»	«START»	«START»	3
+«START»	«START»	ich	2
+alex	.	«END»	2
+«START»	«START»	alex	1
+«START»	alex	bin	1
+«START»	ich	bin	1
+«START»	ich	heiße	1
+alex	bin	ich	1
+bin	alex	.	1
+bin	ich	.	1
+heiße	alex	.	1
+ich	.	«END»	1
+ich	bin	alex	1
+ich	heiße	alex	1
diff --git a/src/test/resources/simple_3lpgram_padded.freq b/src/test/resources/simple_3lpgram_padded.freq
new file mode 100644
index 0000000..19b899c
--- /dev/null
+++ b/src/test/resources/simple_3lpgram_padded.freq
@@ -0,0 +1,16 @@
+.	.	$.	«END»	«END»	«STARTEND»	«END»	«END»	«STARTEND»	3
+«END»	«END»	«STARTEND»	«END»	«END»	«STARTEND»	«END»	«END»	«STARTEND»	3
+«START»	«START»	«STARTEND»	«START»	«START»	«STARTEND»	«START»	«START»	«STARTEND»	3
+alex	alex	NE	.	.	$.	«END»	«END»	«STARTEND»	2
+«START»	«START»	«STARTEND»	«START»	«START»	«STARTEND»	ich	ich	PPER	2
+alex	alex	NE	bin	sein	VAFIN	ich	ich	PPER	1
+bin	sein	VAFIN	alex	alex	NE	.	.	$.	1
+bin	sein	VAFIN	ich	ich	PPER	.	.	$.	1
+heiße	heißen	VAFIN	alex	alex	NE	.	.	$.	1
+ich	ich	PPER	.	.	$.	«END»	«END»	«STARTEND»	1
+ich	ich	PPER	bin	sein	VAFIN	alex	alex	NE	1
+ich	ich	PPER	heiße	heißen	VAFIN	alex	alex	NE	1
+«START»	«START»	«STARTEND»	alex	alex	NE	bin	sein	VAFIN	1
+«START»	«START»	«STARTEND»	ich	ich	PPER	bin	sein	VAFIN	1
+«START»	«START»	«STARTEND»	ich	ich	PPER	heiße	heißen	VAFIN	1
+«START»	«START»	«STARTEND»	«START»	«START»	«STARTEND»	alex	alex	NE	1