arnaucube
arnaucube/mirror-to-giteaPublic Self-hosted repository
mirror-to-gitea/vendor/github.com/onsi/ginkgo/internal/containernode/container_node.go
vendor/github.com/onsi/ginkgo/internal/containernode/container_node.goRaw
  1package containernode
  2
  3import (
  4	"math/rand"
  5	"sort"
  6
  7	"github.com/onsi/ginkgo/internal/leafnodes"
  8	"github.com/onsi/ginkgo/types"
  9)
 10
 11type subjectOrContainerNode struct {
 12	containerNode *ContainerNode
 13	subjectNode   leafnodes.SubjectNode
 14}
 15
 16func (n subjectOrContainerNode) text() string {
 17	if n.containerNode != nil {
 18		return n.containerNode.Text()
 19	} else {
 20		return n.subjectNode.Text()
 21	}
 22}
 23
 24type CollatedNodes struct {
 25	Containers []*ContainerNode
 26	Subject    leafnodes.SubjectNode
 27}
 28
 29type ContainerNode struct {
 30	text         string
 31	flag         types.FlagType
 32	codeLocation types.CodeLocation
 33
 34	setupNodes               []leafnodes.BasicNode
 35	subjectAndContainerNodes []subjectOrContainerNode
 36}
 37
 38func New(text string, flag types.FlagType, codeLocation types.CodeLocation) *ContainerNode {
 39	return &ContainerNode{
 40		text:         text,
 41		flag:         flag,
 42		codeLocation: codeLocation,
 43	}
 44}
 45
 46func (container *ContainerNode) Shuffle(r *rand.Rand) {
 47	sort.Sort(container)
 48	permutation := r.Perm(len(container.subjectAndContainerNodes))
 49	shuffledNodes := make([]subjectOrContainerNode, len(container.subjectAndContainerNodes))
 50	for i, j := range permutation {
 51		shuffledNodes[i] = container.subjectAndContainerNodes[j]
 52	}
 53	container.subjectAndContainerNodes = shuffledNodes
 54}
 55
 56func (node *ContainerNode) BackPropagateProgrammaticFocus() bool {
 57	if node.flag == types.FlagTypePending {
 58		return false
 59	}
 60
 61	shouldUnfocus := false
 62	for _, subjectOrContainerNode := range node.subjectAndContainerNodes {
 63		if subjectOrContainerNode.containerNode != nil {
 64			shouldUnfocus = subjectOrContainerNode.containerNode.BackPropagateProgrammaticFocus() || shouldUnfocus
 65		} else {
 66			shouldUnfocus = (subjectOrContainerNode.subjectNode.Flag() == types.FlagTypeFocused) || shouldUnfocus
 67		}
 68	}
 69
 70	if shouldUnfocus {
 71		if node.flag == types.FlagTypeFocused {
 72			node.flag = types.FlagTypeNone
 73		}
 74		return true
 75	}
 76
 77	return node.flag == types.FlagTypeFocused
 78}
 79
 80func (node *ContainerNode) Collate() []CollatedNodes {
 81	return node.collate([]*ContainerNode{})
 82}
 83
 84func (node *ContainerNode) collate(enclosingContainers []*ContainerNode) []CollatedNodes {
 85	collated := make([]CollatedNodes, 0)
 86
 87	containers := make([]*ContainerNode, len(enclosingContainers))
 88	copy(containers, enclosingContainers)
 89	containers = append(containers, node)
 90
 91	for _, subjectOrContainer := range node.subjectAndContainerNodes {
 92		if subjectOrContainer.containerNode != nil {
 93			collated = append(collated, subjectOrContainer.containerNode.collate(containers)...)
 94		} else {
 95			collated = append(collated, CollatedNodes{
 96				Containers: containers,
 97				Subject:    subjectOrContainer.subjectNode,
 98			})
 99		}
100	}
101
102	return collated
103}
104
105func (node *ContainerNode) PushContainerNode(container *ContainerNode) {
106	node.subjectAndContainerNodes = append(node.subjectAndContainerNodes, subjectOrContainerNode{containerNode: container})
107}
108
109func (node *ContainerNode) PushSubjectNode(subject leafnodes.SubjectNode) {
110	node.subjectAndContainerNodes = append(node.subjectAndContainerNodes, subjectOrContainerNode{subjectNode: subject})
111}
112
113func (node *ContainerNode) PushSetupNode(setupNode leafnodes.BasicNode) {
114	node.setupNodes = append(node.setupNodes, setupNode)
115}
116
117func (node *ContainerNode) SetupNodesOfType(nodeType types.SpecComponentType) []leafnodes.BasicNode {
118	nodes := []leafnodes.BasicNode{}
119	for _, setupNode := range node.setupNodes {
120		if setupNode.Type() == nodeType {
121			nodes = append(nodes, setupNode)
122		}
123	}
124	return nodes
125}
126
127func (node *ContainerNode) Text() string {
128	return node.text
129}
130
131func (node *ContainerNode) CodeLocation() types.CodeLocation {
132	return node.codeLocation
133}
134
135func (node *ContainerNode) Flag() types.FlagType {
136	return node.flag
137}
138
139//sort.Interface
140
141func (node *ContainerNode) Len() int {
142	return len(node.subjectAndContainerNodes)
143}
144
145func (node *ContainerNode) Less(i, j int) bool {
146	return node.subjectAndContainerNodes[i].text() < node.subjectAndContainerNodes[j].text()
147}
148
149func (node *ContainerNode) Swap(i, j int) {
150	node.subjectAndContainerNodes[i], node.subjectAndContainerNodes[j] = node.subjectAndContainerNodes[j], node.subjectAndContainerNodes[i]
151}