소스 검색

Add a few pipeline tests

Vadim Markovtsev 7 년 전
부모
커밋
4bffdf6871
2개의 변경된 파일56개의 추가작업 그리고 10개의 파일을 삭제
  1. 19 2
      pipeline.go
  2. 37 8
      pipeline_test.go

+ 19 - 2
pipeline.go

@@ -16,6 +16,7 @@ import (
 	"gopkg.in/src-d/go-git.v4/plumbing"
 	"gopkg.in/src-d/go-git.v4/plumbing/object"
 	"gopkg.in/src-d/hercules.v3/toposort"
+	"sort"
 )
 
 type ConfigurationOptionType int
@@ -247,8 +248,9 @@ func (pipeline *Pipeline) SetFact(name string, value interface{}) {
 	pipeline.facts[name] = value
 }
 
-func (pipeline *Pipeline) GetFeature(name string) bool {
-	return pipeline.features[name]
+func (pipeline *Pipeline) GetFeature(name string) (bool, bool) {
+	val, exists := pipeline.features[name]
+	return val, exists
 }
 
 func (pipeline *Pipeline) SetFeature(name string) {
@@ -342,8 +344,23 @@ func (pipeline *Pipeline) Commits() []*object.Commit {
 	return result
 }
 
+type sortablePipelineItems []PipelineItem
+
+func (items sortablePipelineItems) Len() int {
+	return len(items)
+}
+
+func (items sortablePipelineItems) Less(i, j int) bool {
+	return items[i].Name() < items[j].Name()
+}
+
+func (items sortablePipelineItems) Swap(i, j int) {
+	items[i], items[j] = items[j], items[i]
+}
+
 func (pipeline *Pipeline) resolve(dumpPath string) {
 	graph := toposort.NewGraph()
+	sort.Sort(sortablePipelineItems(pipeline.items))
 	name2item := map[string]PipelineItem{}
 	ambiguousMap := map[string][]string{}
 	nameUsages := map[string]int{}

+ 37 - 8
pipeline_test.go

@@ -157,6 +157,10 @@ func (item *dependingTestPipelineItem) Configure(facts map[string]interface{}) {
 func (item *dependingTestPipelineItem) Initialize(repository *git.Repository) {
 }
 
+func (item *dependingTestPipelineItem) Flag() string {
+	return "depflag"
+}
+
 func (item *dependingTestPipelineItem) Consume(deps map[string]interface{}) (map[string]interface{}, error) {
 	_, exists := deps["test"]
 	item.DependencySatisfied = exists
@@ -167,6 +171,29 @@ func (item *dependingTestPipelineItem) Consume(deps map[string]interface{}) (map
 	}
 }
 
+func (item *dependingTestPipelineItem) Finalize() interface{} {
+	return true
+}
+
+func (item *dependingTestPipelineItem) Serialize(result interface{}, binary bool, writer io.Writer) error {
+	return nil
+}
+
+func TestPipelineFacts(t *testing.T) {
+	pipeline := NewPipeline(testRepository)
+	pipeline.SetFact("fact", "value")
+	assert.Equal(t, pipeline.GetFact("fact"), "value")
+}
+
+func TestPipelineFeatures(t *testing.T) {
+	pipeline := NewPipeline(testRepository)
+	pipeline.SetFeature("feat")
+	val, _ := pipeline.GetFeature("feat")
+	assert.True(t, val)
+	val, exists := pipeline.GetFeature("!")
+	assert.False(t, exists)
+}
+
 func TestPipelineRun(t *testing.T) {
 	pipeline := NewPipeline(testRepository)
 	item := &testPipelineItem{}
@@ -263,6 +290,7 @@ func TestPipelineDeps(t *testing.T) {
 	item2 := &testPipelineItem{}
 	pipeline.AddItem(item1)
 	pipeline.AddItem(item2)
+	assert.Equal(t, pipeline.Len(), 2)
 	pipeline.Initialize(map[string]interface{}{})
 	commits := make([]*object.Commit, 1)
 	commits[0], _ = testRepository.CommitObject(plumbing.NewHash(
@@ -270,6 +298,7 @@ func TestPipelineDeps(t *testing.T) {
 	result, err := pipeline.Run(commits)
 	assert.Nil(t, err)
 	assert.True(t, result[item1].(bool))
+	assert.Equal(t, result[item2], item2)
 	item1.TestNilConsumeReturn = true
 	assert.Panics(t, func() { pipeline.Run(commits) })
 }
@@ -304,27 +333,27 @@ func TestPipelineSerialize(t *testing.T) {
 	assert.Equal(t, `digraph Hercules {
   "6 BlobCache" -> "7 [blob_cache]"
   "0 DaysSinceStart" -> "3 [day]"
-  "10 FileDiff" -> "12 [file_diff]"
+  "9 FileDiff" -> "11 [file_diff]"
   "15 FileDiffRefiner" -> "16 Burndown"
   "1 IdentityDetector" -> "4 [author]"
   "8 RenameAnalysis" -> "16 Burndown"
-  "8 RenameAnalysis" -> "10 FileDiff"
-  "8 RenameAnalysis" -> "9 UAST"
+  "8 RenameAnalysis" -> "9 FileDiff"
+  "8 RenameAnalysis" -> "10 UAST"
   "8 RenameAnalysis" -> "13 UASTChanges"
   "2 TreeDiff" -> "5 [changes]"
-  "9 UAST" -> "11 [uasts]"
+  "10 UAST" -> "12 [uasts]"
   "13 UASTChanges" -> "14 [changed_uasts]"
   "4 [author]" -> "16 Burndown"
   "7 [blob_cache]" -> "16 Burndown"
-  "7 [blob_cache]" -> "10 FileDiff"
+  "7 [blob_cache]" -> "9 FileDiff"
   "7 [blob_cache]" -> "8 RenameAnalysis"
-  "7 [blob_cache]" -> "9 UAST"
+  "7 [blob_cache]" -> "10 UAST"
   "14 [changed_uasts]" -> "15 FileDiffRefiner"
   "5 [changes]" -> "6 BlobCache"
   "5 [changes]" -> "8 RenameAnalysis"
   "3 [day]" -> "16 Burndown"
-  "12 [file_diff]" -> "15 FileDiffRefiner"
-  "11 [uasts]" -> "13 UASTChanges"
+  "11 [file_diff]" -> "15 FileDiffRefiner"
+  "12 [uasts]" -> "13 UASTChanges"
 }`, dot)
 }