-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathrules_test.go
124 lines (107 loc) · 3.62 KB
/
rules_test.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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package denada
import "log"
import "testing"
import . "github.com/smartystreets/goconvey/convey"
func TestSingularRule(t *testing.T) {
Convey("Testing Singular Rule", t, func() {
info, err := ParseRuleName("singleton")
So(err, ShouldBeNil)
So(info.Context.This, ShouldResemble, ElementList{})
So(info.Name, ShouldEqual, "singleton")
So(info.Cardinality, ShouldEqual, Cardinality(Singleton))
})
}
func TestOptionalRule(t *testing.T) {
Convey("Testing Optional Rule", t, func() {
info, err := ParseRuleName("optional?")
So(err, ShouldBeNil)
So(info.Context.This, ShouldResemble, ElementList{})
So(info.Name, ShouldEqual, "optional")
So(info.Cardinality, ShouldEqual, Cardinality(Optional))
})
}
func TestZoMRule(t *testing.T) {
Convey("Testing Zero-Or-More Rule", t, func() {
info, err := ParseRuleName("zom*")
So(err, ShouldBeNil)
So(info.Context.This, ShouldResemble, ElementList{})
So(info.Name, ShouldEqual, "zom")
So(info.Cardinality, ShouldEqual, Cardinality(ZeroOrMore))
})
}
func TestOoMRule(t *testing.T) {
Convey("Testing One-Or-More Rule", t, func() {
info, err := ParseRuleName("oom+")
So(err, ShouldBeNil)
So(info.Context.This, ShouldResemble, ElementList{})
So(info.Name, ShouldEqual, "oom")
So(info.Cardinality, ShouldEqual, Cardinality(OneOrMore))
})
}
func TestRecursiveRule(t *testing.T) {
Convey("Testing Recursive Rule", t, func() {
dummy := NewDeclaration("dummy", "dummy*")
root := ElementList{dummy}
context := RootContext(root)
info, err := ParseRule("recur>$root", context)
So(err, ShouldBeNil)
So(info.Context.This, ShouldResemble, root)
So(info.Name, ShouldEqual, "recur")
So(info.Cardinality, ShouldEqual, Cardinality(Singleton))
})
}
func TestParentRule(t *testing.T) {
Convey("Testing Parent Rule", t, func() {
dummy := NewDeclaration("dummy", "dummy*")
root := ElementList{dummy}
context := RootContext(root)
Convey("Check that root scope has no parent", func() {
log.Printf("TestParentRule.context = %v", context)
_, err := ParseRule("recur>..", context)
So(err, ShouldNotBeNil)
})
child := ChildContext(ElementList{}, &context)
Convey("Check that child scope has a parent", func() {
info, err := ParseRule("recur>..", child)
So(err, ShouldBeNil)
So(info.Context.This, ShouldResemble, root)
So(info.Name, ShouldEqual, "recur")
So(info.Cardinality, ShouldEqual, Cardinality(Singleton))
})
Convey("Check that parent of child of root is root", func() {
info, err := ParseRule("recur>..", child)
So(err, ShouldBeNil)
rinfo, err := ParseRule("recur>..", child)
So(err, ShouldBeNil)
So(info.Context, ShouldResemble, rinfo.Context)
})
})
}
func TestCurrentRule(t *testing.T) {
Convey("Testing Current Rule", t, func() {
dummy := NewDeclaration("dummy", "dummy*")
root := ElementList{dummy}
context := RootContext(root)
info, err := ParseRule("recur>.", context)
So(err, ShouldBeNil)
So(info.Context.This, ShouldResemble, root)
So(info.Name, ShouldEqual, "recur")
So(info.Cardinality, ShouldEqual, Cardinality(Singleton))
info, err = ParseRule("recur", context)
So(err, ShouldBeNil)
So(info.Context.This, ShouldResemble, root)
So(info.Name, ShouldEqual, "recur")
So(info.Cardinality, ShouldEqual, Cardinality(Singleton))
})
}
func TestRecursiveComplexRule(t *testing.T) {
Convey("Testing Complex Recursive Rule", t, func() {
root := ElementList{new(Element)}
context := RootContext(root)
info, err := ParseRule("recur?>$root", context)
So(err, ShouldBeNil)
So(info.Context.This, ShouldResemble, root)
So(info.Name, ShouldEqual, "recur")
So(info.Cardinality, ShouldEqual, Cardinality(Optional))
})
}