func AddConcepts(conceptFile string, conceptDictionary *gauge.ConceptDictionary) *ParseError { concepts, parseResults := new(ConceptParser).ParseFile(conceptFile) if parseResults != nil && parseResults.Warnings != nil { for _, warning := range parseResults.Warnings { logger.Warning(warning.String()) } } if parseResults != nil && parseResults.Error != nil { return parseResults.Error } for _, conceptStep := range concepts { if _, exists := conceptDictionary.ConceptsMap[conceptStep.Value]; exists { return &ParseError{Message: "Duplicate concept definition found", LineNo: conceptStep.LineNo, LineText: conceptStep.LineText} } conceptDictionary.ReplaceNestedConceptSteps(conceptStep) conceptDictionary.ConceptsMap[conceptStep.Value] = &gauge.Concept{conceptStep, conceptFile} } conceptDictionary.UpdateLookupForNestedConcepts() return validateConcepts(conceptDictionary) }
func checkCircularReferencing(conceptDictionary *gauge.ConceptDictionary, concept *gauge.Step, traversedSteps map[string]string) *ParseError { if traversedSteps == nil { traversedSteps = make(map[string]string, 0) } currentConceptFileName := conceptDictionary.Search(concept.Value).FileName traversedSteps[concept.Value] = currentConceptFileName for _, step := range concept.ConceptSteps { if fileName, exists := traversedSteps[step.Value]; exists { return &ParseError{LineNo: step.LineNo, Message: fmt.Sprintf("%s: The concept \"%s\" references a higher concept > %s: \"%s\"", currentConceptFileName, concept.LineText, fileName, step.LineText), } } if step.IsConcept { if err := checkCircularReferencing(conceptDictionary, step, traversedSteps); err != nil { return err } } } delete(traversedSteps, concept.Value) return nil }
func processConceptStep(spec *gauge.Specification, step *gauge.Step, conceptDictionary *gauge.ConceptDictionary) { if conceptFromDictionary := conceptDictionary.Search(step.Value); conceptFromDictionary != nil { createConceptStep(spec, conceptFromDictionary.ConceptStep, step) } }