github.com/getgauge/gauge@v1.6.9/parser/processor.go (about)

     1  /*----------------------------------------------------------------
     2   *  Copyright (c) ThoughtWorks, Inc.
     3   *  Licensed under the Apache License, Version 2.0
     4   *  See LICENSE in the project root for license information.
     5   *----------------------------------------------------------------*/
     6  
     7  package parser
     8  
     9  import (
    10  	"bytes"
    11  	"fmt"
    12  	"strings"
    13  
    14  	"github.com/getgauge/gauge/gauge"
    15  )
    16  
    17  func processSpec(parser *SpecParser, token *Token) ([]error, bool) {
    18  	return []error{}, false
    19  }
    20  
    21  func processTearDown(parser *SpecParser, token *Token) ([]error, bool) {
    22  	if len(token.Value) < 3 {
    23  		return []error{fmt.Errorf("Teardown should have at least three underscore characters")}, true
    24  	}
    25  	return []error{}, false
    26  }
    27  
    28  func processDataTable(parser *SpecParser, token *Token) ([]error, bool) {
    29  	if len(strings.TrimSpace(strings.Replace(token.Value, "table:", "", 1))) == 0 {
    30  		return []error{fmt.Errorf("Table location not specified")}, true
    31  	}
    32  	return []error{}, false
    33  }
    34  
    35  func processScenario(parser *SpecParser, token *Token) ([]error, bool) {
    36  	if len(strings.TrimSpace(token.Value)) < 1 {
    37  		return []error{fmt.Errorf("Scenario heading should have at least one character")}, true
    38  	}
    39  	parser.clearState()
    40  	return []error{}, false
    41  }
    42  
    43  func processComment(parser *SpecParser, token *Token) ([]error, bool) {
    44  	parser.clearState()
    45  	addStates(&parser.currentState, commentScope)
    46  	return []error{}, false
    47  }
    48  
    49  func processTag(parser *SpecParser, token *Token) ([]error, bool) {
    50  	if isInState(parser.currentState, tagsScope) {
    51  		retainStates(&parser.currentState, tagsScope)
    52  	} else {
    53  		parser.clearState()
    54  	}
    55  	tokens := splitAndTrimTags(token.Value)
    56  
    57  	for _, tagValue := range tokens {
    58  		if len(tagValue) > 0 {
    59  			token.Args = append(token.Args, tagValue)
    60  		}
    61  	}
    62  	return []error{}, false
    63  }
    64  
    65  func processTable(parser *SpecParser, token *Token) ([]error, bool) {
    66  	var buffer bytes.Buffer
    67  	shouldEscape := false
    68  	var errs []error
    69  	for i, element := range token.Value {
    70  		if i == 0 {
    71  			continue
    72  		}
    73  		if shouldEscape {
    74  			_, err := buffer.WriteRune(element)
    75  			if err != nil {
    76  				errs = append(errs, err)
    77  			}
    78  			shouldEscape = false
    79  			continue
    80  		}
    81  		if element == '\\' {
    82  			shouldEscape = true
    83  			continue
    84  		} else if element == '|' {
    85  			trimmedValue := strings.TrimSpace(buffer.String())
    86  
    87  			if token.Kind == gauge.TableHeader {
    88  				if len(trimmedValue) == 0 {
    89  					errs = append(errs, fmt.Errorf("Table header should not be blank"))
    90  				} else if arrayContains(token.Args, trimmedValue) {
    91  					errs = append(errs, fmt.Errorf("Table header cannot have repeated column values"))
    92  				}
    93  			}
    94  			token.Args = append(token.Args, trimmedValue)
    95  			buffer.Reset()
    96  		} else {
    97  			_, err := buffer.WriteRune(element)
    98  			if err != nil {
    99  				errs = append(errs, err)
   100  			}
   101  		}
   102  	}
   103  
   104  	if !isInState(parser.currentState, tableScope) {
   105  		addStates(&parser.currentState, tableScope)
   106  	} else {
   107  		addStates(&parser.currentState, tableDataScope)
   108  	}
   109  
   110  	return errs, false
   111  }
   112  
   113  func splitAndTrimTags(tag string) []string {
   114  	listOfTags := strings.Split(tag, ",")
   115  	for i, aTag := range listOfTags {
   116  		listOfTags[i] = strings.TrimSpace(aTag)
   117  	}
   118  	return listOfTags
   119  }