add some features and expected output for pretty formatter
Этот коммит содержится в:
		
							родитель
							
								
									5bb581e3bd
								
							
						
					
					
						коммит
						edf592e2b9
					
				
					 8 изменённых файлов: 120 добавлений и 6 удалений
				
			
		
							
								
								
									
										11
									
								
								fmt.go
									
										
									
									
									
								
							
							
						
						
									
										11
									
								
								fmt.go
									
										
									
									
									
								
							|  | @ -306,16 +306,21 @@ func (f *basefmt) Summary() { | ||||||
| 			switch t := def.(type) { | 			switch t := def.(type) { | ||||||
| 			case *gherkin.Scenario: | 			case *gherkin.Scenario: | ||||||
| 				total++ | 				total++ | ||||||
|  | 				if len(t.Steps) == 0 { | ||||||
|  | 					undefined++ | ||||||
|  | 				} | ||||||
| 			case *gherkin.ScenarioOutline: | 			case *gherkin.ScenarioOutline: | ||||||
| 				for _, ex := range t.Examples { | 				for _, ex := range t.Examples { | ||||||
| 					if examples, hasExamples := examples(ex); hasExamples { | 					if examples, hasExamples := examples(ex); hasExamples { | ||||||
| 						total += len(examples.TableBody) | 						total += len(examples.TableBody) | ||||||
|  | 						if len(t.Steps) == 0 { | ||||||
|  | 							undefined += len(examples.TableBody) | ||||||
|  | 						} | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	passed = total |  | ||||||
| 	var owner interface{} | 	var owner interface{} | ||||||
| 	for _, undef := range f.undefined { | 	for _, undef := range f.undefined { | ||||||
| 		if owner != undef.owner { | 		if owner != undef.owner { | ||||||
|  | @ -323,6 +328,7 @@ func (f *basefmt) Summary() { | ||||||
| 			owner = undef.owner | 			owner = undef.owner | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 	passed = total - undefined | ||||||
| 
 | 
 | ||||||
| 	var steps, parts, scenarios []string | 	var steps, parts, scenarios []string | ||||||
| 	nsteps := len(f.passed) + len(f.failed) + len(f.skipped) + len(f.undefined) + len(f.pending) | 	nsteps := len(f.passed) + len(f.failed) + len(f.skipped) + len(f.undefined) + len(f.pending) | ||||||
|  | @ -343,6 +349,9 @@ func (f *basefmt) Summary() { | ||||||
| 		passed -= undefined | 		passed -= undefined | ||||||
| 		parts = append(parts, yellow(fmt.Sprintf("%d undefined", undefined))) | 		parts = append(parts, yellow(fmt.Sprintf("%d undefined", undefined))) | ||||||
| 		steps = append(steps, yellow(fmt.Sprintf("%d undefined", len(f.undefined)))) | 		steps = append(steps, yellow(fmt.Sprintf("%d undefined", len(f.undefined)))) | ||||||
|  | 	} else if undefined > 0 { | ||||||
|  | 		// there may be some scenarios without steps | ||||||
|  | 		parts = append(parts, yellow(fmt.Sprintf("%d undefined", undefined))) | ||||||
| 	} | 	} | ||||||
| 	if len(f.skipped) > 0 { | 	if len(f.skipped) > 0 { | ||||||
| 		steps = append(steps, cyan(fmt.Sprintf("%d skipped", len(f.skipped)))) | 		steps = append(steps, cyan(fmt.Sprintf("%d skipped", len(f.skipped)))) | ||||||
|  |  | ||||||
|  | @ -58,7 +58,7 @@ func (f *pretty) Feature(ft *gherkin.Feature, p string, c []byte) { | ||||||
| 		fmt.Fprintln(f.out, "") | 		fmt.Fprintln(f.out, "") | ||||||
| 	} | 	} | ||||||
| 	f.features = append(f.features, &feature{Path: p, Feature: ft}) | 	f.features = append(f.features, &feature{Path: p, Feature: ft}) | ||||||
| 	fmt.Fprintln(f.out, whiteb(ft.Keyword+": ")+ft.Name) | 	fmt.Fprintln(f.out, whiteb(ft.Keyword+":")+" "+ft.Name) | ||||||
| 	if strings.TrimSpace(ft.Description) != "" { | 	if strings.TrimSpace(ft.Description) != "" { | ||||||
| 		for _, line := range strings.Split(ft.Description, "\n") { | 		for _, line := range strings.Split(ft.Description, "\n") { | ||||||
| 			fmt.Fprintln(f.out, s(f.indent)+strings.TrimSpace(line)) | 			fmt.Fprintln(f.out, s(f.indent)+strings.TrimSpace(line)) | ||||||
|  | @ -115,7 +115,7 @@ func (f *pretty) printUndefinedScenario(sc *gherkin.Scenario) { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	f.commentPos = f.longestStep(sc.Steps, f.length(sc)) | 	f.commentPos = f.longestStep(sc.Steps, f.length(sc)) | ||||||
| 	text := s(f.indent) + whiteb(f.scenario.Keyword+": ") + sc.Name | 	text := s(f.indent) + whiteb(f.scenario.Keyword+":") + " " + sc.Name | ||||||
| 	text += s(f.commentPos-f.length(f.scenario)+1) + f.line(sc.Location) | 	text += s(f.commentPos-f.length(f.scenario)+1) + f.line(sc.Location) | ||||||
| 	fmt.Fprintln(f.out, "\n"+text) | 	fmt.Fprintln(f.out, "\n"+text) | ||||||
| } | } | ||||||
|  | @ -209,7 +209,7 @@ func (f *pretty) printOutlineExample(outline *gherkin.ScenarioOutline) { | ||||||
| 	// an example table header | 	// an example table header | ||||||
| 	if firstExample { | 	if firstExample { | ||||||
| 		fmt.Fprintln(f.out, "") | 		fmt.Fprintln(f.out, "") | ||||||
| 		fmt.Fprintln(f.out, s(f.indent*2)+whiteb(example.Keyword+": ")+example.Name) | 		fmt.Fprintln(f.out, s(f.indent*2)+whiteb(example.Keyword+":")+" "+example.Name) | ||||||
| 
 | 
 | ||||||
| 		for i, cell := range example.TableHeader.Cells { | 		for i, cell := range example.TableHeader.Cells { | ||||||
| 			val := cyan(cell.Value) | 			val := cyan(cell.Value) | ||||||
|  | @ -306,7 +306,7 @@ func (f *pretty) printStepKind(res *stepResult) { | ||||||
| 					f.commentPos = bgLen | 					f.commentPos = bgLen | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			text := s(f.indent) + whiteb(f.scenario.Keyword+": ") + f.scenario.Name | 			text := s(f.indent) + whiteb(f.scenario.Keyword+":") + " " + f.scenario.Name | ||||||
| 			text += s(f.commentPos-f.length(f.scenario)+1) + f.line(f.scenario.Location) | 			text += s(f.commentPos-f.length(f.scenario)+1) + f.line(f.scenario.Location) | ||||||
| 			fmt.Fprintln(f.out, "\n"+text) | 			fmt.Fprintln(f.out, "\n"+text) | ||||||
| 			f.scenarioKeyword = true | 			f.scenarioKeyword = true | ||||||
|  |  | ||||||
|  | @ -1 +1,5 @@ | ||||||
| Feature: empty feature | <bold-white>Feature:</bold-white> empty feature | ||||||
|  | 
 | ||||||
|  | No scenarios | ||||||
|  | No steps | ||||||
|  | 0s | ||||||
|  |  | ||||||
							
								
								
									
										8
									
								
								formatter-tests/pretty/empty_with_description
									
										
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										8
									
								
								formatter-tests/pretty/empty_with_description
									
										
									
									
									
										Обычный файл
									
								
							|  | @ -0,0 +1,8 @@ | ||||||
|  | <bold-white>Feature:</bold-white> empty feature | ||||||
|  |   describes | ||||||
|  |   an empty | ||||||
|  |   feature | ||||||
|  | 
 | ||||||
|  | No scenarios | ||||||
|  | No steps | ||||||
|  | 0s | ||||||
|  | @ -0,0 +1,7 @@ | ||||||
|  | <bold-white>Feature:</bold-white> empty feature | ||||||
|  | 
 | ||||||
|  |   <bold-white>Scenario:</bold-white> without steps <black># formatter-tests/features/empty_with_single_scenario_without_steps.feature:3</black> | ||||||
|  | 
 | ||||||
|  | 1 scenarios (<yellow>1 undefined</yellow>) | ||||||
|  | No steps | ||||||
|  | 0s | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | <bold-white>Feature:</bold-white> empty feature | ||||||
|  |   describes | ||||||
|  |   an empty | ||||||
|  |   feature | ||||||
|  | 
 | ||||||
|  |   <bold-white>Scenario:</bold-white> without steps <black># formatter-tests/features/empty_with_single_scenario_without_steps_and_description.feature:6</black> | ||||||
|  | 
 | ||||||
|  | 1 scenarios (<yellow>1 undefined</yellow>) | ||||||
|  | No steps | ||||||
|  | 0s | ||||||
							
								
								
									
										11
									
								
								formatter-tests/pretty/single_scenario_with_passing_step
									
										
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										11
									
								
								formatter-tests/pretty/single_scenario_with_passing_step
									
										
									
									
									
										Обычный файл
									
								
							|  | @ -0,0 +1,11 @@ | ||||||
|  | <bold-white>Feature:</bold-white> single passing scenario | ||||||
|  |   describes | ||||||
|  |   a single scenario | ||||||
|  |   feature | ||||||
|  | 
 | ||||||
|  |   <bold-white>Scenario:</bold-white> one step passing <black># formatter-tests/features/single_scenario_with_passing_step.feature:6</black> | ||||||
|  |     <green>Given</green> <green>a passing step</green>     <black># formatters_print_test.go:35 -> github.com/DATA-DOG/godog.TestPrintingFormatters.func4</black> | ||||||
|  | 
 | ||||||
|  | 1 scenarios (<green>1 passed</green>) | ||||||
|  | 1 steps (<green>1 passed</green>) | ||||||
|  | 0s | ||||||
|  | @ -1 +1,66 @@ | ||||||
| package godog | package godog | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"fmt" | ||||||
|  | 	"io/ioutil" | ||||||
|  | 	"os" | ||||||
|  | 	"strings" | ||||||
|  | 	"testing" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func TestPrintingFormatters(t *testing.T) { | ||||||
|  | 	features, err := parseFeatures("", []string{"formatter-tests"}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Fatalf("failed to parse formatter features: %v", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var buf bytes.Buffer | ||||||
|  | 	out := &tagColorWriter{w: &buf} | ||||||
|  | 
 | ||||||
|  | 	suite := &Suite{ | ||||||
|  | 		features: features, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	suite.Step(`^(?:a )?failing step`, func() error { | ||||||
|  | 		return fmt.Errorf("step failed") | ||||||
|  | 	}) | ||||||
|  | 	suite.Step(`^this step should fail`, func() error { | ||||||
|  | 		return fmt.Errorf("step failed") | ||||||
|  | 	}) | ||||||
|  | 	suite.Step(`^(?:a )?pending step$`, func() error { | ||||||
|  | 		return ErrPending | ||||||
|  | 	}) | ||||||
|  | 	suite.Step(`^(?:a )?passing step$`, func() error { | ||||||
|  | 		return nil | ||||||
|  | 	}) | ||||||
|  | 
 | ||||||
|  | 	for _, feat := range features { | ||||||
|  | 		for name := range AvailableFormatters() { | ||||||
|  | 			expectOutputPath := strings.Replace(feat.Path, "features", name, 1) | ||||||
|  | 			expectOutputPath = strings.TrimRight(expectOutputPath, ".feature") | ||||||
|  | 			if _, err := os.Stat(expectOutputPath); err != nil { | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			buf.Reset()                          // flush the output | ||||||
|  | 			suite.fmt = FindFmt(name)(name, out) // prepare formatter | ||||||
|  | 			suite.features = []*feature{feat}    // set the feature | ||||||
|  | 
 | ||||||
|  | 			expectedOutput, err := ioutil.ReadFile(expectOutputPath) | ||||||
|  | 			if err != nil { | ||||||
|  | 				t.Fatal(err) | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			suite.run() | ||||||
|  | 			suite.fmt.Summary() | ||||||
|  | 
 | ||||||
|  | 			expected := string(expectedOutput) | ||||||
|  | 			actual := buf.String() | ||||||
|  | 
 | ||||||
|  | 			if actual != expected { | ||||||
|  | 				t.Fatalf("%s does not match to:\n%s", expectOutputPath, actual) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче
	
	 gedi
						gedi