123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476 |
- /*
- * ECAL
- *
- * Copyright 2020 Matthias Ladkau. All rights reserved.
- *
- * This Source Code Form is subject to the terms of the MIT
- * License, If a copy of the MIT License was not distributed with this
- * file, You can obtain one at https://opensource.org/licenses/MIT.
- */
- package util
- import (
- "encoding/json"
- "fmt"
- "strings"
- "sync"
- "testing"
- "devt.de/krotik/ecal/parser"
- "devt.de/krotik/ecal/scope"
- )
- func TestRuntimeError(t *testing.T) {
- ast, _ := parser.Parse("foo", "a")
- err1 := NewRuntimeError("foo", fmt.Errorf("foo"), "bar", ast)
- if err1.Error() != "ECAL error in foo: foo (bar) (Line:1 Pos:1)" {
- t.Error("Unexpected result:", err1)
- return
- }
- ast.Token = nil
- err2 := NewRuntimeError("foo", fmt.Errorf("foo"), "bar", ast)
- if err2.Error() != "ECAL error in foo: foo (bar)" {
- t.Error("Unexpected result:", err2)
- return
- }
- ast, _ = parser.Parse("foo", "a:=1")
- err3 := NewRuntimeError("foo", fmt.Errorf("foo"), "bar", ast)
- ast, _ = parser.Parse("bar1", "print(b)")
- err3.(TraceableRuntimeError).AddTrace(ast)
- ast, _ = parser.Parse("bar2", "raise(c)")
- err3.(TraceableRuntimeError).AddTrace(ast)
- ast, _ = parser.Parse("bar3", "1 + d")
- err3.(TraceableRuntimeError).AddTrace(ast)
- trace := strings.Join(err3.(TraceableRuntimeError).GetTraceString(), "\n")
- if trace != `print(b) (bar1:1)
- raise(c) (bar2:1)
- 1 + d (bar3:1)` {
- t.Error("Unexpected result:", trace)
- return
- }
- err4 := &RuntimeErrorWithDetail{err3.(*RuntimeError), nil, nil}
- res, _ := json.MarshalIndent(err4.RuntimeError, "", " ")
- if string(res) != `{
- "Detail": "bar",
- "Node": {
- "Name": ":=",
- "Token": {
- "ID": 39,
- "Pos": 1,
- "Val": ":=",
- "Identifier": false,
- "AllowEscapes": false,
- "PrefixNewlines": 0,
- "Lsource": "foo",
- "Lline": 1,
- "Lpos": 2
- },
- "Meta": null,
- "Children": [
- {
- "Name": "identifier",
- "Token": {
- "ID": 7,
- "Pos": 0,
- "Val": "a",
- "Identifier": true,
- "AllowEscapes": false,
- "PrefixNewlines": 0,
- "Lsource": "foo",
- "Lline": 1,
- "Lpos": 1
- },
- "Meta": null,
- "Children": [],
- "Runtime": null
- },
- {
- "Name": "number",
- "Token": {
- "ID": 6,
- "Pos": 3,
- "Val": "1",
- "Identifier": false,
- "AllowEscapes": false,
- "PrefixNewlines": 0,
- "Lsource": "foo",
- "Lline": 1,
- "Lpos": 4
- },
- "Meta": null,
- "Children": [],
- "Runtime": null
- }
- ],
- "Runtime": null
- },
- "Source": "foo",
- "Trace": [
- {
- "Name": "identifier",
- "Token": {
- "ID": 7,
- "Pos": 0,
- "Val": "print",
- "Identifier": true,
- "AllowEscapes": false,
- "PrefixNewlines": 0,
- "Lsource": "bar1",
- "Lline": 1,
- "Lpos": 1
- },
- "Meta": null,
- "Children": [
- {
- "Name": "funccall",
- "Token": null,
- "Meta": null,
- "Children": [
- {
- "Name": "identifier",
- "Token": {
- "ID": 7,
- "Pos": 6,
- "Val": "b",
- "Identifier": true,
- "AllowEscapes": false,
- "PrefixNewlines": 0,
- "Lsource": "bar1",
- "Lline": 1,
- "Lpos": 7
- },
- "Meta": null,
- "Children": [],
- "Runtime": null
- }
- ],
- "Runtime": null
- }
- ],
- "Runtime": null
- },
- {
- "Name": "identifier",
- "Token": {
- "ID": 7,
- "Pos": 0,
- "Val": "raise",
- "Identifier": true,
- "AllowEscapes": false,
- "PrefixNewlines": 0,
- "Lsource": "bar2",
- "Lline": 1,
- "Lpos": 1
- },
- "Meta": null,
- "Children": [
- {
- "Name": "funccall",
- "Token": null,
- "Meta": null,
- "Children": [
- {
- "Name": "identifier",
- "Token": {
- "ID": 7,
- "Pos": 6,
- "Val": "c",
- "Identifier": true,
- "AllowEscapes": false,
- "PrefixNewlines": 0,
- "Lsource": "bar2",
- "Lline": 1,
- "Lpos": 7
- },
- "Meta": null,
- "Children": [],
- "Runtime": null
- }
- ],
- "Runtime": null
- }
- ],
- "Runtime": null
- },
- {
- "Name": "plus",
- "Token": {
- "ID": 33,
- "Pos": 2,
- "Val": "+",
- "Identifier": false,
- "AllowEscapes": false,
- "PrefixNewlines": 0,
- "Lsource": "bar3",
- "Lline": 1,
- "Lpos": 3
- },
- "Meta": null,
- "Children": [
- {
- "Name": "number",
- "Token": {
- "ID": 6,
- "Pos": 0,
- "Val": "1",
- "Identifier": false,
- "AllowEscapes": false,
- "PrefixNewlines": 0,
- "Lsource": "bar3",
- "Lline": 1,
- "Lpos": 1
- },
- "Meta": null,
- "Children": [],
- "Runtime": null
- },
- {
- "Name": "identifier",
- "Token": {
- "ID": 7,
- "Pos": 4,
- "Val": "d",
- "Identifier": true,
- "AllowEscapes": false,
- "PrefixNewlines": 0,
- "Lsource": "bar3",
- "Lline": 1,
- "Lpos": 5
- },
- "Meta": null,
- "Children": [],
- "Runtime": null
- }
- ],
- "Runtime": null
- }
- ],
- "Type": "foo"
- }` {
- t.Error("Unexpected result:", string(res))
- return
- }
- s := scope.NewScope("aa")
- s.SetValue("xx", 123)
- err4 = &RuntimeErrorWithDetail{err3.(*RuntimeError), s, sync.Mutex{}}
- res, _ = json.MarshalIndent(err4, "", " ")
- if string(res) != `{
- "Data": {},
- "Detail": "bar",
- "Environment": {
- "xx": 123
- },
- "Node": {
- "Name": ":=",
- "Token": {
- "ID": 39,
- "Pos": 1,
- "Val": ":=",
- "Identifier": false,
- "AllowEscapes": false,
- "PrefixNewlines": 0,
- "Lsource": "foo",
- "Lline": 1,
- "Lpos": 2
- },
- "Meta": null,
- "Children": [
- {
- "Name": "identifier",
- "Token": {
- "ID": 7,
- "Pos": 0,
- "Val": "a",
- "Identifier": true,
- "AllowEscapes": false,
- "PrefixNewlines": 0,
- "Lsource": "foo",
- "Lline": 1,
- "Lpos": 1
- },
- "Meta": null,
- "Children": [],
- "Runtime": null
- },
- {
- "Name": "number",
- "Token": {
- "ID": 6,
- "Pos": 3,
- "Val": "1",
- "Identifier": false,
- "AllowEscapes": false,
- "PrefixNewlines": 0,
- "Lsource": "foo",
- "Lline": 1,
- "Lpos": 4
- },
- "Meta": null,
- "Children": [],
- "Runtime": null
- }
- ],
- "Runtime": null
- },
- "Source": "foo",
- "Trace": [
- {
- "Name": "identifier",
- "Token": {
- "ID": 7,
- "Pos": 0,
- "Val": "print",
- "Identifier": true,
- "AllowEscapes": false,
- "PrefixNewlines": 0,
- "Lsource": "bar1",
- "Lline": 1,
- "Lpos": 1
- },
- "Meta": null,
- "Children": [
- {
- "Name": "funccall",
- "Token": null,
- "Meta": null,
- "Children": [
- {
- "Name": "identifier",
- "Token": {
- "ID": 7,
- "Pos": 6,
- "Val": "b",
- "Identifier": true,
- "AllowEscapes": false,
- "PrefixNewlines": 0,
- "Lsource": "bar1",
- "Lline": 1,
- "Lpos": 7
- },
- "Meta": null,
- "Children": [],
- "Runtime": null
- }
- ],
- "Runtime": null
- }
- ],
- "Runtime": null
- },
- {
- "Name": "identifier",
- "Token": {
- "ID": 7,
- "Pos": 0,
- "Val": "raise",
- "Identifier": true,
- "AllowEscapes": false,
- "PrefixNewlines": 0,
- "Lsource": "bar2",
- "Lline": 1,
- "Lpos": 1
- },
- "Meta": null,
- "Children": [
- {
- "Name": "funccall",
- "Token": null,
- "Meta": null,
- "Children": [
- {
- "Name": "identifier",
- "Token": {
- "ID": 7,
- "Pos": 6,
- "Val": "c",
- "Identifier": true,
- "AllowEscapes": false,
- "PrefixNewlines": 0,
- "Lsource": "bar2",
- "Lline": 1,
- "Lpos": 7
- },
- "Meta": null,
- "Children": [],
- "Runtime": null
- }
- ],
- "Runtime": null
- }
- ],
- "Runtime": null
- },
- {
- "Name": "plus",
- "Token": {
- "ID": 33,
- "Pos": 2,
- "Val": "+",
- "Identifier": false,
- "AllowEscapes": false,
- "PrefixNewlines": 0,
- "Lsource": "bar3",
- "Lline": 1,
- "Lpos": 3
- },
- "Meta": null,
- "Children": [
- {
- "Name": "number",
- "Token": {
- "ID": 6,
- "Pos": 0,
- "Val": "1",
- "Identifier": false,
- "AllowEscapes": false,
- "PrefixNewlines": 0,
- "Lsource": "bar3",
- "Lline": 1,
- "Lpos": 1
- },
- "Meta": null,
- "Children": [],
- "Runtime": null
- },
- {
- "Name": "identifier",
- "Token": {
- "ID": 7,
- "Pos": 4,
- "Val": "d",
- "Identifier": true,
- "AllowEscapes": false,
- "PrefixNewlines": 0,
- "Lsource": "bar3",
- "Lline": 1,
- "Lpos": 5
- },
- "Meta": null,
- "Children": [],
- "Runtime": null
- }
- ],
- "Runtime": null
- }
- ],
- "Type": "foo"
- }` {
- t.Error("Unexpected result:", string(res))
- return
- }
- }
|