internal/index/stemmer/porter_test.go

package stemmer

import "testing"

func TestStemKnownPairs(t *testing.T) {
	t.Parallel()
	cases := []struct {
		word, want string
	}{
		{"caresses", "caress"},
		{"ponies", "poni"},
		{"ties", "ti"},
		{"caress", "caress"},
		{"cats", "cat"},
		{"feed", "feed"},
		{"agreed", "agre"},
		{"plastered", "plaster"},
		{"bled", "bled"},
		{"motoring", "motor"},
		{"sing", "sing"},
		{"happy", "happi"},
		{"sky", "sky"},
		{"relational", "relat"},
		{"conditional", "condit"},
		{"operator", "oper"},
		{"controllable", "controll"},
		{"roll", "roll"},
	}
	for _, tc := range cases {
		tc := tc
		t.Run(tc.word, func(t *testing.T) {
			t.Parallel()
			got := Stem(tc.word)
			if got != tc.want {
				t.Errorf("Stem(%q) = %q, want %q", tc.word, got, tc.want)
			}
		})
	}
}

func TestStemShortWords(t *testing.T) {
	t.Parallel()
	cases := []string{"a", "an", "in"}
	for _, w := range cases {
		w := w
		t.Run(w, func(t *testing.T) {
			t.Parallel()
			if Stem(w) != w {
				t.Errorf("short word changed: %s -> %s", w, Stem(w))
			}
		})
	}
}

func TestStemAll(t *testing.T) {
	t.Parallel()
	got := StemAll([]string{"caresses", "ponies", "motoring"})
	want := []string{"caress", "poni", "motor"}
	for i := range got {
		if got[i] != want[i] {
			t.Errorf("idx %d: got %q, want %q", i, got[i], want[i])
		}
	}
}

func TestMeasure(t *testing.T) {
	t.Parallel()
	t.Helper()
	cases := map[string]int{
		"":         0,
		"tr":       0,
		"tree":     0,
		"trouble":  1,
		"oaten":    1,
		"orrery":   2,
	}
	for in, want := range cases {
		in, want := in, want
		t.Run(in, func(t *testing.T) {
			t.Parallel()
			if got := measure([]byte(in)); got != want {
				t.Errorf("measure(%q) = %d, want %d", in, got, want)
			}
		})
	}
}