-
Notifications
You must be signed in to change notification settings - Fork 0
/
parseTest.go
91 lines (81 loc) · 2.32 KB
/
parseTest.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package denalijsonparse
import (
"errors"
"fmt"
mj "github.com/Dharitri-org/drtg-vm-util/test-util/denali/json/model"
oj "github.com/Dharitri-org/drtg-vm-util/test-util/orderedjson"
)
// ParseTestFile converts json string to object representation
func (p *Parser) ParseTestFile(jsonString []byte) ([]*mj.Test, error) {
jobj, err := oj.ParseOrderedJSON(jsonString)
if err != nil {
return nil, err
}
topMap, isMap := jobj.(*oj.OJsonMap)
if !isMap {
return nil, errors.New("unmarshalled test top level object is not a map")
}
var top []*mj.Test
for _, kvp := range topMap.OrderedKV {
t, tErr := p.processTest(kvp.Value)
if tErr != nil {
return nil, tErr
}
t.TestName = kvp.Key
top = append(top, t)
}
return top, nil
}
func (p *Parser) processTest(testObj oj.OJsonObject) (*mj.Test, error) {
testMap, isTestMap := testObj.(*oj.OJsonMap)
if !isTestMap {
return nil, errors.New("unmarshalled test object is not a map")
}
test := mj.Test{CheckGas: true}
var err error
for _, kvp := range testMap.OrderedKV {
switch kvp.Key {
case "checkGas":
checkGasOJ, isBool := kvp.Value.(*oj.OJsonBool)
if !isBool {
return nil, errors.New("unmarshalled test checkGas flag is not boolean")
}
test.CheckGas = bool(*checkGasOJ)
case "pre":
test.Pre, err = p.processAccountMap(kvp.Value)
if err != nil {
return nil, fmt.Errorf("cannot parse pre: %w", err)
}
case "blocks":
blocksRaw, blocksOk := kvp.Value.(*oj.OJsonList)
if !blocksOk {
return nil, errors.New("unmarshalled blocks object is not a list")
}
for _, blRaw := range blocksRaw.AsList() {
bl, blErr := p.processBlock(blRaw)
if blErr != nil {
return nil, blErr
}
test.Blocks = append(test.Blocks, bl)
}
case "network":
test.Network, err = p.parseString(kvp.Value)
if err != nil {
return nil, fmt.Errorf("test network value not a string: %w", err)
}
case "blockHashes":
test.BlockHashes, err = p.parseByteArrayList(kvp.Value)
if err != nil {
return nil, fmt.Errorf("unmarshalled blockHashes object is not a list: %w", err)
}
case "postState":
test.PostState, err = p.processCheckAccountMap(kvp.Value)
if err != nil {
return nil, fmt.Errorf("cannot parse postState: %w", err)
}
default:
return nil, fmt.Errorf("unknown test: %s", kvp.Key)
}
}
return &test, nil
}