feature/plural: compute valid forms for a language

Needed for plural.Select.

Change-Id: I52ccca45ec3622d7ac000da021a16b1efcdf08ba
Reviewed-on: https://go-review.googlesource.com/41090
Run-TryBot: Marcel van Lohuizen <mpvl@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Nigel Tao <nigeltao@golang.org>
diff --git a/feature/plural/plural.go b/feature/plural/plural.go
index 41958c6..2b4cfe3 100644
--- a/feature/plural/plural.go
+++ b/feature/plural/plural.go
@@ -124,6 +124,22 @@
 	return matchPlural(p, index, n, f, scale)
 }
 
+func validForms(p *Rules, t language.Tag) (forms []Form) {
+	index, _ := language.CompactIndex(t)
+	offset := p.langToIndex[index]
+	rules := p.rules[p.index[offset]:p.index[offset+1]]
+
+	forms = append(forms, Other)
+	last := Other
+	for _, r := range rules {
+		if cat := Form(r.cat & formMask); cat != andNext && last != cat {
+			forms = append(forms, cat)
+			last = cat
+		}
+	}
+	return forms
+}
+
 func (p *Rules) matchComponents(t language.Tag, n, f, scale int) Form {
 	index, _ := language.CompactIndex(t)
 	return matchPlural(p, index, n, f, scale)
diff --git a/feature/plural/plural_test.go b/feature/plural/plural_test.go
index 9c75f6b..e5524c5 100644
--- a/feature/plural/plural_test.go
+++ b/feature/plural/plural_test.go
@@ -6,6 +6,7 @@
 
 import (
 	"fmt"
+	"reflect"
 	"strconv"
 	"strings"
 	"testing"
@@ -65,6 +66,25 @@
 	return b
 }
 
+func TestValidForms(t *testing.T) {
+	testCases := []struct {
+		tag  language.Tag
+		want []Form
+	}{
+		{language.AmericanEnglish, []Form{Other, One}},
+		{language.Portuguese, []Form{Other, One}},
+		{language.Latvian, []Form{Other, Zero, One}},
+		{language.Arabic, []Form{Other, Zero, One, Two, Few, Many}},
+		{language.Russian, []Form{Other, One, Few, Many}},
+	}
+	for _, tc := range testCases {
+		got := validForms(cardinal, tc.tag)
+		if !reflect.DeepEqual(got, tc.want) {
+			t.Errorf("validForms(%v): got %v; want %v", tc.tag, got, tc.want)
+		}
+	}
+}
+
 func TestOrdinal(t *testing.T) {
 	testPlurals(t, Ordinal, ordinalTests)
 }