123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- /*
- * Public Domain Software
- *
- * I (Matthias Ladkau) am the author of the source code in this file.
- * I have placed the source code in this file in the public domain.
- *
- * For further information see: http://creativecommons.org/publicdomain/zero/1.0/
- */
- package parser
- import (
- "testing"
- )
- func TestErrorHandling(t *testing.T) {
- input := "c:= a + b"
- astres, err := ParseWithRuntime("mytest", input, &DummyRuntimeProvider{})
- if err != nil {
- t.Errorf("Unexpected parser output:\n%vError: %v", astres, err)
- return
- }
- // Make ast invalid
- astres.Children[1].Children[1] = nil
- ppres, err := PrettyPrint(astres)
- if err == nil || err.Error() != "Nil pointer in AST at level: 2" {
- t.Errorf("Unexpected result: %v error: %v", ppres, err)
- return
- }
- }
- func TestArithmeticExpressionPrinting(t *testing.T) {
- input := "a + b * 5 /2-1"
- expectedOutput := `
- minus
- plus
- identifier: a
- div
- times
- identifier: b
- number: 5
- number: 2
- number: 1
- `[1:]
- if err := UnitTestPrettyPrinting(input, expectedOutput,
- "a + b * 5 / 2 - 1"); err != nil {
- t.Error(err)
- return
- }
- input = `-a + "\"'b"`
- expectedOutput = `
- plus
- minus
- identifier: a
- string: '"'b'
- `[1:]
- if err := UnitTestPrettyPrinting(input, expectedOutput,
- `-a + "\"'b"`); err != nil {
- t.Error(err)
- return
- }
- input = `a // 5 % (50 + 1)`
- expectedOutput = `
- modint
- divint
- identifier: a
- number: 5
- plus
- number: 50
- number: 1
- `[1:]
- if err := UnitTestPrettyPrinting(input, expectedOutput,
- `a // 5 % (50 + 1)`); err != nil {
- t.Error(err)
- return
- }
- input = "(a + 1) * 5 / (6 - 2)"
- expectedOutput = `
- div
- times
- plus
- identifier: a
- number: 1
- number: 5
- minus
- number: 6
- number: 2
- `[1:]
- if err := UnitTestPrettyPrinting(input, expectedOutput,
- "(a + 1) * 5 / (6 - 2)"); err != nil {
- t.Error(err)
- return
- }
- input = "a + (1 * 5) / 6 - 2"
- expectedOutput = `
- minus
- plus
- identifier: a
- div
- times
- number: 1
- number: 5
- number: 6
- number: 2
- `[1:]
- if err := UnitTestPrettyPrinting(input, expectedOutput,
- "a + 1 * 5 / 6 - 2"); err != nil {
- t.Error(err)
- return
- }
- }
- func TestLogicalExpressionPrinting(t *testing.T) {
- input := "not (a + 1) * 5 and tRue or not 1 - 5 != '!test'"
- expectedOutput := `
- or
- and
- not
- times
- plus
- identifier: a
- number: 1
- number: 5
- true
- not
- !=
- minus
- number: 1
- number: 5
- string: '!test'
- `[1:]
- if err := UnitTestPrettyPrinting(input, expectedOutput,
- "not (a + 1) * 5 and true or not 1 - 5 != \"!test\""); err != nil {
- t.Error(err)
- return
- }
- input = "not x < null and a > b or 1 <= c and 2 >= false or c == true"
- expectedOutput = `
- or
- or
- and
- not
- <
- identifier: x
- null
- >
- identifier: a
- identifier: b
- and
- <=
- number: 1
- identifier: c
- >=
- number: 2
- false
- ==
- identifier: c
- true
- `[1:]
- if err := UnitTestPrettyPrinting(input, expectedOutput,
- "not x < null and a > b or 1 <= c and 2 >= false or c == true"); err != nil {
- t.Error(err)
- return
- }
- input = "a hasPrefix 'a' and b hassuffix 'c' or d like '^.*' and 3 notin x"
- expectedOutput = `
- or
- and
- hasprefix
- identifier: a
- string: 'a'
- hassuffix
- identifier: b
- string: 'c'
- and
- like
- identifier: d
- string: '^.*'
- notin
- number: 3
- identifier: x
- `[1:]
- if err := UnitTestPrettyPrinting(input, expectedOutput,
- `a hasprefix "a" and b hassuffix "c" or d like "^.*" and 3 notin x`); err != nil {
- t.Error(err)
- return
- }
- }
|