|
| 1 | +package ast |
| 2 | + |
| 3 | +import ( |
| 4 | + "testing" |
| 5 | + |
| 6 | + "github.com/cedar-policy/cedar-go/internal/testutil" |
| 7 | + "github.com/cedar-policy/cedar-go/types" |
| 8 | +) |
| 9 | + |
| 10 | +func TestInspectCounts(t *testing.T) { |
| 11 | + t.Parallel() |
| 12 | + leaf1 := NodeValue{Value: types.Long(1)} |
| 13 | + leaf2 := NodeValue{Value: types.Long(2)} |
| 14 | + cases := []struct { |
| 15 | + name string |
| 16 | + node Node |
| 17 | + want int |
| 18 | + }{ |
| 19 | + {"IfThenElse", NewNode(NodeTypeIfThenElse{If: leaf1, Then: leaf1, Else: leaf1}), 4}, |
| 20 | + {"Or", NewNode(NodeTypeOr{BinaryNode: BinaryNode{Left: leaf1, Right: leaf2}}), 3}, |
| 21 | + {"And", NewNode(NodeTypeAnd{BinaryNode: BinaryNode{Left: leaf1, Right: leaf2}}), 3}, |
| 22 | + {"LessThan", NewNode(NodeTypeLessThan{BinaryNode: BinaryNode{Left: leaf1, Right: leaf2}}), 3}, |
| 23 | + {"LessThanOrEqual", NewNode(NodeTypeLessThanOrEqual{BinaryNode: BinaryNode{Left: leaf1, Right: leaf2}}), 3}, |
| 24 | + {"GreaterThan", NewNode(NodeTypeGreaterThan{BinaryNode: BinaryNode{Left: leaf1, Right: leaf2}}), 3}, |
| 25 | + {"GreaterThanOrEqual", NewNode(NodeTypeGreaterThanOrEqual{BinaryNode: BinaryNode{Left: leaf1, Right: leaf2}}), 3}, |
| 26 | + {"NotEquals", NewNode(NodeTypeNotEquals{BinaryNode: BinaryNode{Left: leaf1, Right: leaf2}}), 3}, |
| 27 | + {"Equals", NewNode(NodeTypeEquals{BinaryNode: BinaryNode{Left: leaf1, Right: leaf2}}), 3}, |
| 28 | + {"In", NewNode(NodeTypeIn{BinaryNode: BinaryNode{Left: leaf1, Right: leaf2}}), 3}, |
| 29 | + {"HasTag", NewNode(NodeTypeHasTag{BinaryNode: BinaryNode{Left: leaf1, Right: leaf2}}), 3}, |
| 30 | + {"GetTag", NewNode(NodeTypeGetTag{BinaryNode: BinaryNode{Left: leaf1, Right: leaf2}}), 3}, |
| 31 | + {"Contains", NewNode(NodeTypeContains{BinaryNode: BinaryNode{Left: leaf1, Right: leaf2}}), 3}, |
| 32 | + {"ContainsAll", NewNode(NodeTypeContainsAll{BinaryNode: BinaryNode{Left: leaf1, Right: leaf2}}), 3}, |
| 33 | + {"ContainsAny", NewNode(NodeTypeContainsAny{BinaryNode: BinaryNode{Left: leaf1, Right: leaf2}}), 3}, |
| 34 | + {"Add", NewNode(NodeTypeAdd{BinaryNode: BinaryNode{Left: leaf1, Right: leaf2}}), 3}, |
| 35 | + {"Sub", NewNode(NodeTypeSub{BinaryNode: BinaryNode{Left: leaf1, Right: leaf2}}), 3}, |
| 36 | + {"Mult", NewNode(NodeTypeMult{BinaryNode: BinaryNode{Left: leaf1, Right: leaf2}}), 3}, |
| 37 | + {"Has", NewNode(NodeTypeHas{StrOpNode: StrOpNode{Arg: leaf1, Value: "a"}}), 2}, |
| 38 | + {"Access", NewNode(NodeTypeAccess{StrOpNode: StrOpNode{Arg: leaf1, Value: "a"}}), 2}, |
| 39 | + {"Like", NewNode(NodeTypeLike{Arg: leaf1, Value: types.NewPattern(types.Wildcard{})}), 2}, |
| 40 | + {"Is", NewNode(NodeTypeIs{Left: leaf1, EntityType: "T"}), 2}, |
| 41 | + {"IsIn", NewNode(NodeTypeIsIn{NodeTypeIs: NodeTypeIs{Left: leaf1, EntityType: "T"}, Entity: leaf2}), 3}, |
| 42 | + {"Negate", NewNode(NodeTypeNegate{UnaryNode: UnaryNode{Arg: leaf1}}), 2}, |
| 43 | + {"Not", NewNode(NodeTypeNot{UnaryNode: UnaryNode{Arg: leaf1}}), 2}, |
| 44 | + {"IsEmpty", NewNode(NodeTypeIsEmpty{UnaryNode: UnaryNode{Arg: leaf1}}), 2}, |
| 45 | + {"ExtensionCall", NewNode(NodeTypeExtensionCall{Name: "f", Args: []IsNode{leaf1, leaf2}}), 3}, |
| 46 | + {"Record", NewNode(NodeTypeRecord{Elements: []RecordElementNode{{Key: "k", Value: leaf1}}}), 2}, |
| 47 | + {"Set", NewNode(NodeTypeSet{Elements: []IsNode{leaf1, leaf2}}), 3}, |
| 48 | + {"Variable", NewNode(NodeTypeVariable{Name: "v"}), 1}, |
| 49 | + {"StrOpNode", NewNode(StrOpNode{Arg: leaf1, Value: "a"}), 2}, |
| 50 | + {"BinaryNode", NewNode(BinaryNode{Left: leaf1, Right: leaf2}), 3}, |
| 51 | + {"UnaryNode", NewNode(UnaryNode{Arg: leaf1}), 2}, |
| 52 | + {"Value", NewNode(leaf1), 1}, |
| 53 | + } |
| 54 | + |
| 55 | + for _, tt := range cases { |
| 56 | + tt := tt |
| 57 | + t.Run(tt.name, func(t *testing.T) { |
| 58 | + t.Parallel() |
| 59 | + count := 0 |
| 60 | + Inspect(tt.node, func(IsNode) bool { count++; return true }) |
| 61 | + testutil.Equals(t, count, tt.want) |
| 62 | + }) |
| 63 | + } |
| 64 | +} |
| 65 | + |
| 66 | +func TestInspectSkipChildren(t *testing.T) { |
| 67 | + t.Parallel() |
| 68 | + leaf := NewNode(NodeValue{Value: types.Long(1)}) |
| 69 | + root := NewNode(NodeTypeAnd{BinaryNode: BinaryNode{Left: leaf.v, Right: leaf.v}}) |
| 70 | + var count int |
| 71 | + Inspect(root, func(n IsNode) bool { |
| 72 | + count++ |
| 73 | + if _, ok := n.(NodeTypeAnd); ok { |
| 74 | + return false |
| 75 | + } |
| 76 | + return true |
| 77 | + }) |
| 78 | + testutil.Equals(t, count, 1) |
| 79 | +} |
| 80 | + |
| 81 | +func TestInspectNil(t *testing.T) { |
| 82 | + t.Parallel() |
| 83 | + var c int |
| 84 | + Inspect(Node{}, func(IsNode) bool { c++; return true }) |
| 85 | + testutil.Equals(t, c, 0) |
| 86 | +} |
0 commit comments