--- /dev/null
+package printf
+
+import "testing"
+
+func BenchmarkParseVerb(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ ParseVerb("%[3]*.[2]*[1]f")
+ }
+}
+
+func TestParseVerb(t *testing.T) {
+ var tests = []struct {
+ in string
+ out Verb
+ }{
+ {
+ `%d`,
+ Verb{
+ Letter: 'd',
+ Width: Default{},
+ Precision: Default{},
+ Value: -1,
+ },
+ },
+ {
+ `%#d`,
+ Verb{
+ Letter: 'd',
+ Flags: "#",
+ Width: Default{},
+ Precision: Default{},
+ Value: -1,
+ },
+ },
+ {
+ `%+#d`,
+ Verb{
+ Letter: 'd',
+ Flags: "+#",
+ Width: Default{},
+ Precision: Default{},
+ Value: -1,
+ },
+ },
+ {
+ `%[2]d`,
+ Verb{
+ Letter: 'd',
+ Width: Default{},
+ Precision: Default{},
+ Value: 2,
+ },
+ },
+ {
+ `%[3]*.[2]*[1]f`,
+ Verb{
+ Letter: 'f',
+ Width: Star{3},
+ Precision: Star{2},
+ Value: 1,
+ },
+ },
+ {
+ `%6.2f`,
+ Verb{
+ Letter: 'f',
+ Width: Literal(6),
+ Precision: Literal(2),
+ Value: -1,
+ },
+ },
+ {
+ `%#[1]x`,
+ Verb{
+ Letter: 'x',
+ Flags: "#",
+ Width: Default{},
+ Precision: Default{},
+ Value: 1,
+ },
+ },
+ {
+ "%%",
+ Verb{
+ Letter: '%',
+ Width: Default{},
+ Precision: Default{},
+ Value: 0,
+ },
+ },
+ {
+ "%*%",
+ Verb{
+ Letter: '%',
+ Width: Star{Index: -1},
+ Precision: Default{},
+ Value: 0,
+ },
+ },
+ {
+ "%[1]%",
+ Verb{
+ Letter: '%',
+ Width: Default{},
+ Precision: Default{},
+ Value: 0,
+ },
+ },
+ }
+
+ for _, tt := range tests {
+ tt.out.Raw = tt.in
+ v, n, err := ParseVerb(tt.in)
+ if err != nil {
+ t.Errorf("unexpected error %s while parsing %s", err, tt.in)
+ }
+ if n != len(tt.in) {
+ t.Errorf("ParseVerb only consumed %d of %d bytes", n, len(tt.in))
+ }
+ if v != tt.out {
+ t.Errorf("%s parsed to %#v, want %#v", tt.in, v, tt.out)
+ }
+ }
+}