Make tokenizer robust and never failing

Change-Id: I7f249434bc233b560c8d493f1f0c2abd4d69db91
diff --git a/matrix_test.go b/matrix_test.go
index 3b64d5c..1e5bdd1 100644
--- a/matrix_test.go
+++ b/matrix_test.go
@@ -70,6 +70,40 @@
 	assert.Equal(7, len(tokens))
 }
 
+func TestMatrixSimpleString(t *testing.T) {
+	assert := assert.New(t)
+	// bau | bauamt
+	tok := LoadFomaFile("testdata/bauamt.fst")
+	mat := tok.ToMatrix()
+
+	b := make([]byte, 0, 2048)
+	w := bytes.NewBuffer(b)
+	var tokens []string
+
+	tokens = ttokenize(mat, w, "ibauamt")
+	assert.Equal("i", tokens[0])
+	assert.Equal("bauamt", tokens[1])
+
+	tokens = ttokenize(mat, w, "ibbauamt")
+	assert.Equal("i", tokens[0])
+
+	assert.Equal("b", tokens[1])
+	assert.Equal("bauamt", tokens[2])
+
+	tokens = ttokenize(mat, w, "bau")
+	assert.Equal("bau", tokens[0])
+
+	tokens = ttokenize(mat, w, "baum")
+	assert.Equal("bau", tokens[0])
+	assert.Equal("m", tokens[1])
+
+	tokens = ttokenize(mat, w, "baudibauamt")
+	assert.Equal("bau", tokens[0])
+	assert.Equal("d", tokens[1])
+	assert.Equal("i", tokens[2])
+	assert.Equal("bauamt", tokens[3])
+}
+
 func TestMatrixReadWriteTokenizer(t *testing.T) {
 	assert := assert.New(t)
 	foma := LoadFomaFile("testdata/simpletok.fst")
@@ -78,9 +112,9 @@
 	mat := foma.ToMatrix()
 	assert.NotNil(mat)
 
-	assert.True(tmatch(mat, "bau"))
-	assert.True(tmatch(mat, "bad"))
-	assert.True(tmatch(mat, "wald gehen"))
+	assert.Equal(ttokenizeStr(mat, "bau"), "bau")
+	assert.Equal(ttokenizeStr(mat, "bad"), "bad")
+	assert.Equal(ttokenizeStr(mat, "wald gehen"), "wald\ngehen")
 	b := make([]byte, 0, 1024)
 	buf := bytes.NewBuffer(b)
 	n, err := mat.WriteTo(buf)
@@ -95,9 +129,9 @@
 	assert.Equal(mat.stateCount, mat2.stateCount)
 	assert.Equal(len(mat.array), len(mat2.array))
 	assert.Equal(mat.array, mat2.array)
-	assert.True(tmatch(mat2, "bau"))
-	assert.True(tmatch(mat2, "bad"))
-	assert.True(tmatch(mat2, "wald gehen"))
+	assert.Equal(ttokenizeStr(mat2, "bau"), "bau")
+	assert.Equal(ttokenizeStr(mat2, "bad"), "bad")
+	assert.Equal(ttokenizeStr(mat2, "wald gehen"), "wald\ngehen")
 }
 
 func TestMatrixIgnorableMCS(t *testing.T) {
@@ -341,6 +375,30 @@
 	assert.Equal(len(sentences), 3)
 	assert.Equal("»\nNun\n,\ngib\ndich\nzufrieden\n,\nich\nfange\nschon\nan\n...", sentences[0])
 	assert.Equal("Also\nBaron\nInnstetten\n!", sentences[1])
+
+}
+
+func TestMatrixFullTokenizerMatrixSentenceSplitterBug1(t *testing.T) {
+	assert := assert.New(t)
+
+	if mat == nil {
+		mat = LoadMatrixFile("testdata/tokenizer.matok")
+	}
+
+	b := make([]byte, 0, 2048)
+	w := bytes.NewBuffer(b)
+	var sentences []string
+
+	text := `Wüllersdorf war aufgestanden. »Ich finde es furchtbar, daß Sie recht haben, aber Sie haben recht. Ich quäle Sie nicht länger mit meinem 'Muß es sein?'. Die Welt ist einmal, wie sie ist, und die Dinge verlaufen nicht, wie wir wollen, sondern wie die andern wollen. Das mit dem 'Gottesgericht', wie manche hochtrabend versichern, ist freilich ein Unsinn, nichts davon, umgekehrt, unser Ehrenkultus ist ein Götzendienst, aber wir müssen uns ihm unterwerfen, solange der Götze gilt.«`
+
+	w.Reset()
+	assert.True(mat.Transduce(strings.NewReader(text), w))
+	sentences = strings.Split(w.String(), "\n\n")
+	assert.Equal(len(sentences), 5)
+	assert.Equal("Wüllersdorf\nwar\naufgestanden\n.", sentences[0])
+	assert.Equal("»\nIch\nfinde\nes\nfurchtbar\n,\ndaß\nSie\nrecht\nhaben\n,\naber\nSie\nhaben\nrecht\n.", sentences[1])
+	assert.Equal("Ich\nquäle\nSie\nnicht\nlänger\nmit\nmeinem\n'\nMuß\nes\nsein\n?\n'\n.\n \nDie\nWelt\nist\neinmal\n,\nwie\nsie\nist\n,\nund\ndie\nDinge\nverlaufen\nnicht\n,\nwie\nwir\nwollen\n,\nsondern\nwie\ndie\nandern\nwollen\n.", sentences[2])
+	assert.Equal("Das\nmit\ndem\n'\nGottesgericht\n'\n,\nwie\nmanche\nhochtrabend\nversichern\n,\nist\nfreilich\nein\nUnsinn\n,\nnichts\ndavon\n,\numgekehrt\n,\nunser\nEhrenkultus\nist\nein\nGötzendienst\n,\naber\nwir\nmüssen\nuns\nihm\nunterwerfen\n,\nsolange\nder\nGötze\ngilt\n.\n«", sentences[3])
 }
 
 func TestMatrixFullTokenizerTokenSplitter(t *testing.T) {