func TestStack(t *testing.T) { tests := []struct { str string ok bool }{ {"()", true}, {"()()", true}, {"(())", true}, {"())(", false}, {"(())()", true}, {")(", false}, } for _, test := range tests { t.Logf("Running test on %s", test.str) p := &parens{} s := New(p) b := lex.Buffer{ Taker: s, Lex: trie.New("trie", "(", ")"), } n, err := b.Read([]byte(test.str)) if err == nil { err = b.Close() } if test.ok { if n != len(test.str) || err != nil { t.Fatalf("expected no error on %s: %d read, error %s", test.str, n, err) } if len(s.Stack) != 1 { t.Fatalf("expected stack size one on %s, got %d", test.str, len(s.Stack)) } else if s.Stack[0].(*parens).String() != test.str { t.Fatalf("expected parse as %s, got %s", test.str, s.Stack[0].(*parens).String()) } } else if n == len(test.str) && err == nil { t.Fatalf("expected error on input %s", test.str) } } }