diff options
author | Alexander Kiryukhin <a.kiryukhin@mail.ru> | 2020-02-13 22:55:13 +0300 |
---|---|---|
committer | Alexander Kiryukhin <a.kiryukhin@mail.ru> | 2020-02-13 22:55:13 +0300 |
commit | 24ca753ba3ab0f0d4fdc413c467bc304da06744f (patch) | |
tree | 9cdf12a41950369e3784a42173f433a07fda8fd6 /tokenizer_test.go |
initial commit
Diffstat (limited to 'tokenizer_test.go')
-rw-r--r-- | tokenizer_test.go | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/tokenizer_test.go b/tokenizer_test.go new file mode 100644 index 0000000..8600024 --- /dev/null +++ b/tokenizer_test.go @@ -0,0 +1,98 @@ +// Copyright (c) 2020 Alexander Kiryukhin <a.kiryukhin@mail.ru> + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package executor + +import ( + "testing" +) + +func TestTokenize(t *testing.T) { + operators := map[string]*Operator{ + "+": {Op: "+", Assoc: LeftAssoc, Priority: 1, Fn: func(a float64, b float64) (float64, error) { return a + b, nil }}, + "-": {Op: "-", Assoc: LeftAssoc, Priority: 1, Fn: func(a float64, b float64) (float64, error) { return a - b, nil }}, + "*": {Op: "*", Assoc: LeftAssoc, Priority: 2, Fn: func(a float64, b float64) (float64, error) { return a * b, nil }}, + "/": {Op: "/", Assoc: LeftAssoc, Priority: 2, Fn: func(a float64, b float64) (float64, error) { return a / b, nil }}, + } + tk := newTokenizer("((15/(7-(1+1)))*-3)-(-2+(1+1))", operators) + if err := tk.tokenize(); err != nil { + t.Error(err) + } + tkns, err := tk.toRPN() + if err != nil { + t.Error(err) + } + expected := []token{ + {literalType, "", 15}, + {literalType, "", 7}, + {literalType, "", 1}, + {literalType, "", 1}, + {operatorType, "+", 0}, + {operatorType, "-", 0}, + {operatorType, "/", 0}, + {literalType, "", -3}, + {operatorType, "*", 0}, + {literalType, "", -2}, + {literalType, "", 1}, + {literalType, "", 1}, + {operatorType, "+", 0}, + {operatorType, "+", 0}, + {operatorType, "-", 0}, + } + if len(tkns) != len(expected) { + t.Errorf("Expected len = %d, got %d", len(expected), len(tkns)) + } + for i, tkn := range tkns { + if tkn.Type != expected[i].Type { + t.Errorf("Expected type %d, got %d at pos %d", expected[i].Type, tkn.Type, i) + } + if tkn.SValue != expected[i].SValue { + t.Errorf("Expected %s, got %s at pos %d", expected[i].SValue, tkn.SValue, i) + } + if tkn.FValue != expected[i].FValue { + t.Errorf("Expected %f, got %f at pos %d", expected[i].FValue, tkn.FValue, i) + } + } + tk = newTokenizer("a**b==10", operators) + if err := tk.tokenize(); err != nil { + t.Error(err) + } + expected = []token{ + {variableType, "a", 0}, + {operatorType, "**", 0}, + {variableType, "b", 0}, + {operatorType, "==", 0}, + {literalType, "", 10}, + } + if len(tk.tkns) != len(expected) { + t.Errorf("Expected len = %d, got %d", len(expected), len(tkns)) + } + for i, tkn := range tk.tkns { + if tkn.Type != expected[i].Type { + t.Errorf("Expected type %d, got %d at pos %d", expected[i].Type, tkn.Type, i) + } + if tkn.SValue != expected[i].SValue { + t.Errorf("Expected %s, got %s at pos %d", expected[i].SValue, tkn.SValue, i) + } + if tkn.FValue != expected[i].FValue { + t.Errorf("Expected %f, got %f at pos %d", expected[i].FValue, tkn.FValue, i) + } + } +} |