Bläddra i källkod

Fix couples tests

Signed-off-by: Vadim Markovtsev <vadim@sourced.tech>
Vadim Markovtsev 6 år sedan
förälder
incheckning
b58b1ee9d9
2 ändrade filer med 110 tillägg och 91 borttagningar
  1. 34 22
      leaves/couples.go
  2. 76 69
      leaves/couples_test.go

+ 34 - 22
leaves/couples.go

@@ -379,7 +379,7 @@ func (couples *CouplesAnalysis) serializeText(result *CouplesResult, writer io.W
 
 	fmt.Fprintln(writer, "  people_coocc:")
 	fmt.Fprintln(writer, "    index:")
-	for _, person := range couples.reversedPeopleDict {
+	for _, person := range result.reversedPeopleDict {
 		fmt.Fprintf(writer, "      - %s\n", yaml.SafeString(person))
 	}
 
@@ -401,7 +401,7 @@ func (couples *CouplesAnalysis) serializeText(result *CouplesResult, writer io.W
 	}
 
 	fmt.Fprintln(writer, "    author_files:") // sorted by number of files each author changed
-	peopleFiles := sortByNumberOfFiles(result.PeopleFiles, couples.reversedPeopleDict, result.Files)
+	peopleFiles := sortByNumberOfFiles(result.PeopleFiles, result.reversedPeopleDict, result.Files)
 	for _, authorFiles := range peopleFiles {
 		fmt.Fprintf(writer, "      - %s:\n", yaml.SafeString(authorFiles.Author))
 		sort.Strings(authorFiles.Files)
@@ -477,9 +477,14 @@ func (couples *CouplesAnalysis) serializeBinary(result *CouplesResult, writer io
 
 // currentFiles return the list of files in the last consumed commit.
 func (couples *CouplesAnalysis) currentFiles() map[string]bool {
+	files := map[string]bool{}
+	if couples.lastCommit == nil {
+		for key := range couples.files {
+			files[key] = true
+		}
+	}
 	tree, _ := couples.lastCommit.Tree()
 	fileIter := tree.Files()
-	files := map[string]bool{}
 	fileIter.ForEach(func(fobj *object.File) error {
 		files[fobj.Name] = true
 		return nil
@@ -495,7 +500,6 @@ func (couples *CouplesAnalysis) propagateRenames(files map[string]bool) (
 	reducedFiles := map[string]map[string]int{}
 	for file := range files {
 		fmap := map[string]int{}
-		reducedFiles[file] = fmap
 		refmap := couples.files[file]
 		for other := range files {
 			refval := refmap[other]
@@ -503,29 +507,30 @@ func (couples *CouplesAnalysis) propagateRenames(files map[string]bool) (
 				fmap[other] = refval
 			}
 		}
+		if len(fmap) > 0 {
+			reducedFiles[file] = fmap
+		}
 	}
 	// propagate renames
 	aliases := map[string]map[string]bool{}
-	{
-		pointers := map[string]string{}
-		for i := range renames {
-			rename := renames[len(renames)-i-1]
-			toName := rename.ToName
-			if newTo, exists := pointers[toName]; exists {
-				toName = newTo
-			}
-			if _, exists := reducedFiles[toName]; exists {
-				if rename.FromName != toName {
-					var set map[string]bool
-					if set, exists = aliases[toName]; !exists {
-						set = map[string]bool{}
-						aliases[toName] = set
-					}
-					set[rename.FromName] = true
-					pointers[rename.FromName] = toName
+	pointers := map[string]string{}
+	for i := range renames {
+		rename := renames[len(renames)-i-1]
+		toName := rename.ToName
+		if newTo, exists := pointers[toName]; exists {
+			toName = newTo
+		}
+		if _, exists := reducedFiles[toName]; exists {
+			if rename.FromName != toName {
+				var set map[string]bool
+				if set, exists = aliases[toName]; !exists {
+					set = map[string]bool{}
+					aliases[toName] = set
 				}
-				continue
+				set[rename.FromName] = true
+				pointers[rename.FromName] = toName
 			}
+			continue
 		}
 	}
 	adjustments := map[string]map[string]int{}
@@ -567,6 +572,13 @@ func (couples *CouplesAnalysis) propagateRenames(files map[string]bool) (
 				reducedCounts[file] = count
 			}
 		}
+		for key, val := range counts {
+			if _, exists := files[key]; !exists {
+				if _, exists = pointers[key]; !exists {
+					reducedCounts[key] = val
+				}
+			}
+		}
 	}
 	return reducedFiles, people
 }

+ 76 - 69
leaves/couples_test.go

@@ -16,7 +16,7 @@ import (
 	"gopkg.in/src-d/hercules.v4/internal/plumbing"
 	"gopkg.in/src-d/hercules.v4/internal/plumbing/identity"
 	"gopkg.in/src-d/hercules.v4/internal/test"
-		)
+	)
 
 func fixtureCouples() *CouplesAnalysis {
 	c := CouplesAnalysis{PeopleNumber: 3}
@@ -91,61 +91,78 @@ func TestCouplesConsumeFinalize(t *testing.T) {
 	deps := map[string]interface{}{}
 	deps[identity.DependencyAuthor] = 0
 	deps[core.DependencyCommit], _ = test.Repository.CommitObject(gitplumbing.NewHash(
-		"cce947b98a050c6d356bc6ba95030254914027b1"))
-	deps[plumbing.DependencyTreeChanges] = generateChanges("+two", "+four", "+six")
+		"a3ee37f91f0d705ec9c41ae88426f0ae44b2fbc3"))
+	deps[plumbing.DependencyTreeChanges] = generateChanges("+LICENSE2", "+file2.go", "+rbtree2.go")
 	c.Consume(deps)
-	deps[plumbing.DependencyTreeChanges] = generateChanges("+one", "-two", "=three", ">four>five")
+	deps[plumbing.DependencyTreeChanges] = generateChanges("+README.md", "-LICENSE2", "=analyser.go", ">file2.go>file_test.go")
 	c.Consume(deps)
 	deps[identity.DependencyAuthor] = 1
-	deps[plumbing.DependencyTreeChanges] = generateChanges("=one", "=three", "-six")
+	deps[plumbing.DependencyTreeChanges] = generateChanges("=README.md", "=analyser.go", "-rbtree2.go")
 	c.Consume(deps)
 	deps[identity.DependencyAuthor] = 2
-	deps[plumbing.DependencyTreeChanges] = generateChanges("=five")
+	deps[plumbing.DependencyTreeChanges] = generateChanges("=file_test.go")
 	c.Consume(deps)
-	assert.Equal(t, len(c.people[0]), 5)
-	assert.Equal(t, c.people[0]["one"], 1)
-	assert.Equal(t, c.people[0]["two"], 2)
-	assert.Equal(t, c.people[0]["three"], 1)
-	assert.Equal(t, c.people[0]["five"], 2)
-	assert.Equal(t, c.people[0]["six"], 1)
+	assert.Equal(t, len(c.people[0]), 6)
+	assert.Equal(t, c.people[0]["README.md"], 1)
+	assert.Equal(t, c.people[0]["LICENSE2"], 2)
+	assert.Equal(t, c.people[0]["analyser.go"], 1)
+	assert.Equal(t, c.people[0]["file2.go"], 1)
+	assert.Equal(t, c.people[0]["file_test.go"], 1)
+	assert.Equal(t, c.people[0]["rbtree2.go"], 1)
 	assert.Equal(t, len(c.people[1]), 3)
-	assert.Equal(t, c.people[1]["one"], 1)
-	assert.Equal(t, c.people[1]["three"], 1)
-	assert.Equal(t, c.people[1]["six"], 1)
+	assert.Equal(t, c.people[1]["README.md"], 1)
+	assert.Equal(t, c.people[1]["analyser.go"], 1)
+	assert.Equal(t, c.people[1]["rbtree2.go"], 1)
 	assert.Equal(t, len(c.people[2]), 1)
-	assert.Equal(t, c.people[2]["five"], 1)
-	assert.Equal(t, len(c.files["one"]), 3)
-	assert.Equal(t, c.files["one"]["one"], 2)
-	assert.Equal(t, c.files["one"]["three"], 2)
-	assert.Equal(t, c.files["one"]["five"], 1)
-	assert.NotContains(t, c.files, "two")
-	assert.NotContains(t, c.files, "four")
-	assert.NotContains(t, c.files, "six")
-	assert.Equal(t, len(c.files["three"]), 3)
-	assert.Equal(t, c.files["three"]["three"], 2)
-	assert.Equal(t, c.files["three"]["one"], 2)
-	assert.Equal(t, c.files["three"]["five"], 1)
-	assert.Equal(t, len(c.files["five"]), 3)
-	assert.Equal(t, c.files["five"]["five"], 3)
-	assert.Equal(t, c.files["five"]["one"], 1)
-	assert.Equal(t, c.files["five"]["three"], 1)
+	assert.Equal(t, c.people[2]["file_test.go"], 1)
+	assert.Equal(t, len(c.files["README.md"]), 3)
+	assert.Equal(t, c.files["README.md"], map[string]int{
+		"README.md": 2,
+		"analyser.go": 2,
+		"file_test.go": 1,
+	})
+	assert.Equal(t, c.files["LICENSE2"], map[string]int{
+		"LICENSE2": 1,
+		"file2.go": 1,
+		"rbtree2.go": 1,
+	})
+	assert.Equal(t, c.files["file2.go"], map[string]int{
+		"LICENSE2": 1,
+		"file2.go": 1,
+		"rbtree2.go": 1,
+	})
+	assert.Equal(t, c.files["rbtree2.go"], map[string]int{
+		"LICENSE2": 1,
+		"file2.go": 1,
+		"rbtree2.go": 1,
+	})
+	assert.Equal(t, c.files["analyser.go"], map[string]int{
+		"analyser.go": 2,
+		"README.md": 2,
+		"file_test.go": 1,
+	})
+	assert.Equal(t, c.files["file_test.go"], map[string]int{
+		"file_test.go": 2,
+		"README.md": 1,
+		"analyser.go": 1,
+	})
 	assert.Equal(t, c.peopleCommits[0], 2)
 	assert.Equal(t, c.peopleCommits[1], 1)
 	assert.Equal(t, c.peopleCommits[2], 1)
 	cr := c.Finalize().(CouplesResult)
 	assert.Equal(t, len(cr.Files), 3)
-	assert.Equal(t, cr.Files[0], "five")
-	assert.Equal(t, cr.Files[1], "one")
-	assert.Equal(t, cr.Files[2], "three")
+	assert.Equal(t, cr.Files[0], "README.md")
+	assert.Equal(t, cr.Files[1], "analyser.go")
+	assert.Equal(t, cr.Files[2], "file_test.go")
 	assert.Equal(t, len(cr.PeopleFiles[0]), 3)
 	assert.Equal(t, cr.PeopleFiles[0][0], 0)
 	assert.Equal(t, cr.PeopleFiles[0][1], 1)
 	assert.Equal(t, cr.PeopleFiles[0][2], 2)
 	assert.Equal(t, len(cr.PeopleFiles[1]), 2)
-	assert.Equal(t, cr.PeopleFiles[1][0], 1)
-	assert.Equal(t, cr.PeopleFiles[1][1], 2)
+	assert.Equal(t, cr.PeopleFiles[1][0], 0)
+	assert.Equal(t, cr.PeopleFiles[1][1], 1)
 	assert.Equal(t, len(cr.PeopleFiles[2]), 1)
-	assert.Equal(t, cr.PeopleFiles[2][0], 0)
+	assert.Equal(t, cr.PeopleFiles[2][0], 2)
 	assert.Equal(t, len(cr.PeopleMatrix[0]), 3)
 	assert.Equal(t, cr.PeopleMatrix[0][0], int64(7))
 	assert.Equal(t, cr.PeopleMatrix[0][1], int64(3))
@@ -158,17 +175,17 @@ func TestCouplesConsumeFinalize(t *testing.T) {
 	assert.Equal(t, cr.PeopleMatrix[2][2], int64(1))
 	assert.Equal(t, len(cr.FilesMatrix), 3)
 	assert.Equal(t, len(cr.FilesMatrix[0]), 3)
-	assert.Equal(t, cr.FilesMatrix[0][0], int64(3))
-	assert.Equal(t, cr.FilesMatrix[0][1], int64(1))
 	assert.Equal(t, cr.FilesMatrix[0][2], int64(1))
+	assert.Equal(t, cr.FilesMatrix[0][0], int64(2))
+	assert.Equal(t, cr.FilesMatrix[0][1], int64(2))
 	assert.Equal(t, len(cr.FilesMatrix[1]), 3)
-	assert.Equal(t, cr.FilesMatrix[1][0], int64(1))
+	assert.Equal(t, cr.FilesMatrix[1][2], int64(1))
+	assert.Equal(t, cr.FilesMatrix[1][0], int64(2))
 	assert.Equal(t, cr.FilesMatrix[1][1], int64(2))
-	assert.Equal(t, cr.FilesMatrix[1][2], int64(2))
 	assert.Equal(t, len(cr.FilesMatrix[2]), 3)
 	assert.Equal(t, cr.FilesMatrix[2][0], int64(1))
-	assert.Equal(t, cr.FilesMatrix[2][1], int64(2))
-	assert.Equal(t, cr.FilesMatrix[2][2], int64(2))
+	assert.Equal(t, cr.FilesMatrix[2][1], int64(1))
+	assert.Equal(t, cr.FilesMatrix[2][2], int64(3))
 }
 
 func TestCouplesFork(t *testing.T) {
@@ -176,36 +193,26 @@ func TestCouplesFork(t *testing.T) {
 	clones := couples1.Fork(1)
 	assert.Len(t, clones, 1)
 	couples2 := clones[0].(*CouplesAnalysis)
-	assert.True(t, couples1 == couples2)
+	assert.True(t, couples1 != couples2)
+	assert.Equal(t, *couples1, *couples2)
 	couples1.Merge([]core.PipelineItem{couples2})
 }
 
 func TestCouplesSerialize(t *testing.T) {
 	c := fixtureCouples()
-	c.PeopleNumber = 1
-	people := [...]string{"p1", "p2", "p3"}
-	facts := map[string]interface{}{}
-	c.Configure(facts)
-	assert.Equal(t, c.PeopleNumber, 1)
-	facts[identity.FactIdentityDetectorPeopleCount] = 3
-	facts[identity.FactIdentityDetectorReversedPeopleDict] = people[:]
-	c.Configure(facts)
-	assert.Equal(t, c.PeopleNumber, 3)
-	deps := map[string]interface{}{}
-	deps[identity.DependencyAuthor] = 0
-	deps[plumbing.DependencyTreeChanges] = generateChanges("+two", "+four", "+six")
-	deps[core.DependencyCommit], _ = test.Repository.CommitObject(gitplumbing.NewHash(
-		"cce947b98a050c6d356bc6ba95030254914027b1"))
-	c.Consume(deps)
-	deps[plumbing.DependencyTreeChanges] = generateChanges("+one", "-two", "=three", ">four>five")
-	c.Consume(deps)
-	deps[identity.DependencyAuthor] = 1
-	deps[plumbing.DependencyTreeChanges] = generateChanges("=one", "=three", "-six")
-	c.Consume(deps)
-	deps[identity.DependencyAuthor] = 2
-	deps[plumbing.DependencyTreeChanges] = generateChanges("=five")
-	c.Consume(deps)
-	result := c.Finalize().(CouplesResult)
+	result := CouplesResult {
+		PeopleMatrix: []map[int]int64{
+			{0:7, 1:3, 2:1}, {0:3, 1:3}, {0:1, 2:1}, {},
+		},
+		PeopleFiles: [][]int{
+			{0, 1, 2}, {1, 2}, {0}, {},
+		},
+		FilesMatrix: []map[int]int64{
+			{1:1, 2:1, 0:3}, {1:2, 2:2, 0:1}, {2:2, 0:1, 1:2},
+		},
+		Files: []string{"five", "one", "three"},
+		reversedPeopleDict: []string{"p1", "p2", "p3"},
+	}
 	buffer := &bytes.Buffer{}
 	c.Serialize(result, false, buffer)
 	assert.Equal(t, buffer.String(), `  files_coocc:
@@ -249,7 +256,7 @@ func TestCouplesSerialize(t *testing.T) {
 	assert.Equal(t, msg.PeopleFiles[1].Files, tmp2[:])
 	tmp3 := [...]int32{0}
 	assert.Equal(t, msg.PeopleFiles[2].Files, tmp3[:])
-	assert.Equal(t, msg.PeopleCouples.Index, people[:])
+	assert.Equal(t, msg.PeopleCouples.Index, result.reversedPeopleDict)
 	assert.Equal(t, msg.PeopleCouples.Matrix.NumberOfRows, int32(4))
 	assert.Equal(t, msg.PeopleCouples.Matrix.NumberOfColumns, int32(4))
 	data := [...]int64{7, 3, 1, 3, 3, 1, 1}