131 строка
		
	
	
	
		
			2,8 КиБ
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			131 строка
		
	
	
	
		
			2,8 КиБ
		
	
	
	
		
			Go
		
	
	
	
	
	
| package gherkin
 | |
| 
 | |
| import (
 | |
| 	"strings"
 | |
| 	"testing"
 | |
| )
 | |
| 
 | |
| func (a *parser) assertMatchesTypes(expected []TokenType, t *testing.T) {
 | |
| 	key := -1
 | |
| 	for _, tok := range a.ast {
 | |
| 		key++
 | |
| 		if len(expected) <= key {
 | |
| 			t.Fatalf("there are more tokens in AST then expected, next is '%s'", tok.Type)
 | |
| 		}
 | |
| 		if expected[key] != tok.Type {
 | |
| 			t.Fatalf("expected ast token '%s', but got '%s' at position: %d", expected[key], tok.Type, key)
 | |
| 		}
 | |
| 	}
 | |
| 	if len(expected)-1 != key {
 | |
| 		t.Fatalf("expected ast length %d, does not match actual: %d", len(expected), key+1)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (s *Scenario) assertHasTag(tag string, t *testing.T) {
 | |
| 	if !s.Tags.Has(Tag(tag)) {
 | |
| 		t.Fatalf("expected scenario '%s' to have '%s' tag, but it did not", s.Title, tag)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (s *Scenario) assertHasNumTags(n int, t *testing.T) {
 | |
| 	if len(s.Tags) != n {
 | |
| 		t.Fatalf("expected scenario '%s' to have '%d' tags, but it has '%d'", s.Title, n, len(s.Tags))
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func Test_parse_feature_file(t *testing.T) {
 | |
| 
 | |
| 	content := strings.Join([]string{
 | |
| 		// feature
 | |
| 		"@global-one @cust",
 | |
| 		testFeatureSamples["feature"] + "\n",
 | |
| 		// background
 | |
| 		indent(2, "Background:"),
 | |
| 		testStepSamples["given_table_hash"] + "\n",
 | |
| 		// scenario - normal without tags
 | |
| 		indent(2, "Scenario: user is able to register"),
 | |
| 		testStepSamples["step_group"] + "\n",
 | |
| 		// scenario - repeated tag, one extra
 | |
| 		indent(2, "@user @cust"),
 | |
| 		indent(2, "Scenario: password is required to login"),
 | |
| 		testStepSamples["step_group_another"] + "\n",
 | |
| 		// scenario - no steps yet
 | |
| 		indent(2, "@todo"), // cust - tag is repeated
 | |
| 		indent(2, "Scenario: user is able to reset his password") + "\n",
 | |
| 		// scenario outline
 | |
| 		testLexerSamples["scenario_outline_with_examples"],
 | |
| 	}, "\n")
 | |
| 
 | |
| 	p := &parser{
 | |
| 		lx:   newLexer(strings.NewReader(content)),
 | |
| 		path: "usual.feature",
 | |
| 	}
 | |
| 	ft, err := p.parseFeature()
 | |
| 	if err != nil {
 | |
| 		t.Fatalf("unexpected error: %s", err)
 | |
| 	}
 | |
| 	ft.assertTitle("gherkin parser", t)
 | |
| 
 | |
| 	p.assertMatchesTypes([]TokenType{
 | |
| 		TAGS,
 | |
| 		FEATURE,
 | |
| 		TEXT,
 | |
| 		TEXT,
 | |
| 		TEXT,
 | |
| 		NEWLINE,
 | |
| 
 | |
| 		BACKGROUND,
 | |
| 		GIVEN,
 | |
| 		TABLEROW,
 | |
| 		NEWLINE,
 | |
| 
 | |
| 		SCENARIO,
 | |
| 		GIVEN,
 | |
| 		AND,
 | |
| 		WHEN,
 | |
| 		THEN,
 | |
| 		NEWLINE,
 | |
| 
 | |
| 		TAGS,
 | |
| 		SCENARIO,
 | |
| 		GIVEN,
 | |
| 		AND,
 | |
| 		WHEN,
 | |
| 		THEN,
 | |
| 		NEWLINE,
 | |
| 
 | |
| 		TAGS,
 | |
| 		SCENARIO,
 | |
| 		NEWLINE,
 | |
| 
 | |
| 		OUTLINE,
 | |
| 		GIVEN,
 | |
| 		AND,
 | |
| 		AND,
 | |
| 		WHEN,
 | |
| 		THEN,
 | |
| 		NEWLINE,
 | |
| 		EXAMPLES,
 | |
| 		TABLEROW,
 | |
| 		TABLEROW,
 | |
| 		TABLEROW,
 | |
| 	}, t)
 | |
| 
 | |
| 	ft.assertHasNumScenarios(4, t)
 | |
| 
 | |
| 	ft.Scenarios[0].assertHasNumTags(2, t)
 | |
| 	ft.Scenarios[0].assertHasTag("global-one", t)
 | |
| 	ft.Scenarios[0].assertHasTag("cust", t)
 | |
| 
 | |
| 	ft.Scenarios[1].assertHasNumTags(3, t)
 | |
| 	ft.Scenarios[1].assertHasTag("global-one", t)
 | |
| 	ft.Scenarios[1].assertHasTag("cust", t)
 | |
| 	ft.Scenarios[1].assertHasTag("user", t)
 | |
| 
 | |
| 	ft.Scenarios[2].assertHasNumTags(3, t)
 | |
| 	ft.Scenarios[2].assertHasTag("global-one", t)
 | |
| 	ft.Scenarios[2].assertHasTag("cust", t)
 | |
| 	ft.Scenarios[2].assertHasTag("todo", t)
 | |
| 
 | |
| 	ft.Scenarios[3].assertHasNumTags(2, t)
 | |
| }
 | 
