| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 | package uastimport (	"io/ioutil"	"os"	"path"	"testing"	"time"	"unicode/utf8"	"github.com/sergi/go-diff/diffmatchpatch"	"github.com/stretchr/testify/assert"	"gopkg.in/bblfsh/sdk.v2/uast/nodes"	"gopkg.in/bblfsh/sdk.v2/uast/nodes/nodesproto"	"gopkg.in/src-d/go-git.v4/plumbing/object"	"gopkg.in/src-d/hercules.v10/internal/core"	"gopkg.in/src-d/hercules.v10/internal/plumbing"	"gopkg.in/src-d/hercules.v10/internal/test")func fixtureFileDiffRefiner() *FileDiffRefiner {	fd := &FileDiffRefiner{}	fd.Initialize(test.Repository)	return fd}func TestFileDiffRefinerMeta(t *testing.T) {	fd := fixtureFileDiffRefiner()	assert.Equal(t, fd.Name(), "FileDiffRefiner")	assert.Equal(t, len(fd.Provides()), 1)	assert.Equal(t, fd.Provides()[0], plumbing.DependencyFileDiff)	assert.Equal(t, len(fd.Requires()), 2)	assert.Equal(t, fd.Requires()[0], plumbing.DependencyFileDiff)	assert.Equal(t, fd.Requires()[1], DependencyUastChanges)	assert.Len(t, fd.ListConfigurationOptions(), 0)	fd.Configure(nil)	features := fd.Features()	assert.Len(t, features, 1)	assert.Equal(t, features[0], FeatureUast)}func TestFileDiffRefinerRegistration(t *testing.T) {	summoned := core.Registry.Summon((&FileDiffRefiner{}).Name())	assert.Len(t, summoned, 1)	assert.Equal(t, summoned[0].Name(), "FileDiffRefiner")	summoned = core.Registry.Summon((&FileDiffRefiner{}).Provides()[0])	assert.True(t, len(summoned) >= 1)	matched := false	for _, tp := range summoned {		matched = matched || tp.Name() == "FileDiffRefiner"	}	assert.True(t, matched)}func loadUast(t *testing.T, name string) nodes.Node {	filename := path.Join("..", "..", "test_data", name)	reader, err := os.Open(filename)	if err != nil {		assert.Failf(t, "cannot load %s: %v", filename, err)	}	node, err := nodesproto.ReadTree(reader)	if err != nil {		assert.Failf(t, "cannot load %s: %v", filename, err)	}	return node}func TestFileDiffRefinerConsume(t *testing.T) {	bytes1, err := ioutil.ReadFile(path.Join("..", "..", "test_data", "1.java"))	assert.Nil(t, err)	bytes2, err := ioutil.ReadFile(path.Join("..", "..", "test_data", "2.java"))	assert.Nil(t, err)	dmp := diffmatchpatch.New()	dmp.DiffTimeout = time.Hour	src, dst, _ := dmp.DiffLinesToRunes(string(bytes1), string(bytes2))	state := map[string]interface{}{}	fileDiffs := map[string]plumbing.FileDiffData{}	const fileName = "test.java"	fileDiffs[fileName] = plumbing.FileDiffData{		OldLinesOfCode: len(src),		NewLinesOfCode: len(dst),		Diffs:          dmp.DiffMainRunes(src, dst, false),	}	state[plumbing.DependencyFileDiff] = fileDiffs	uastChanges := make([]Change, 1)	state[DependencyUastChanges] = uastChanges	uastChanges[0] = Change{		Change: &object.Change{			From: object.ChangeEntry{Name: fileName},			To:   object.ChangeEntry{Name: fileName}},		Before: loadUast(t, "uast1.pb"), After: loadUast(t, "uast2.pb"),	}	fd := fixtureFileDiffRefiner()	iresult, err := fd.Consume(state)	assert.Nil(t, err)	result := iresult[plumbing.DependencyFileDiff].(map[string]plumbing.FileDiffData)	assert.Len(t, result, 1)	oldDiff := fileDiffs[fileName]	newDiff := result[fileName]	assert.Equal(t, oldDiff.OldLinesOfCode, newDiff.OldLinesOfCode)	assert.Equal(t, oldDiff.NewLinesOfCode, newDiff.NewLinesOfCode)	assert.Equal(t, len(oldDiff.Diffs)+1, len(newDiff.Diffs))	assert.Equal(t, dmp.DiffText2(oldDiff.Diffs), dmp.DiffText2(newDiff.Diffs))	// Some hardcoded length checks	assert.Equal(t, utf8.RuneCountInString(newDiff.Diffs[6].Text), 11)	assert.Equal(t, utf8.RuneCountInString(newDiff.Diffs[7].Text), 41)	assert.Equal(t, utf8.RuneCountInString(newDiff.Diffs[8].Text), 231)}func TestFileDiffRefinerConsumeNoUast(t *testing.T) {	bytes1, err := ioutil.ReadFile(path.Join("..", "..", "test_data", "1.java"))	assert.Nil(t, err)	bytes2, err := ioutil.ReadFile(path.Join("..", "..", "test_data", "2.java"))	assert.Nil(t, err)	dmp := diffmatchpatch.New()	dmp.DiffTimeout = time.Hour	src, dst, _ := dmp.DiffLinesToRunes(string(bytes1), string(bytes2))	state := map[string]interface{}{}	fileDiffs := map[string]plumbing.FileDiffData{}	const fileName = "test.java"	fileDiffs[fileName] = plumbing.FileDiffData{		OldLinesOfCode: len(src),		NewLinesOfCode: len(dst),		Diffs:          dmp.DiffMainRunes(src, dst, false),	}	state[plumbing.DependencyFileDiff] = fileDiffs	uastChanges := make([]Change, 1)	state[DependencyUastChanges] = uastChanges	uastChanges[0] = Change{		Change: &object.Change{			From: object.ChangeEntry{Name: fileName},			To:   object.ChangeEntry{Name: fileName}},		Before: loadUast(t, "uast1.pb"), After: nil,	}	fd := fixtureFileDiffRefiner()	iresult, err := fd.Consume(state)	assert.Nil(t, err)	result := iresult[plumbing.DependencyFileDiff].(map[string]plumbing.FileDiffData)	assert.Len(t, result, 1)	assert.Equal(t, fileDiffs[fileName], result[fileName])	fileDiffs[fileName] = plumbing.FileDiffData{		OldLinesOfCode: 100,		NewLinesOfCode: 100,		Diffs:          []diffmatchpatch.Diff{{}},	}	uastChanges[0] = Change{		Change: &object.Change{			From: object.ChangeEntry{Name: fileName},			To:   object.ChangeEntry{Name: fileName}},		Before: loadUast(t, "uast1.pb"), After: loadUast(t, "uast2.pb"),	}	iresult, err = fd.Consume(state)	assert.Nil(t, err)	result = iresult[plumbing.DependencyFileDiff].(map[string]plumbing.FileDiffData)	assert.Len(t, result, 1)	assert.Equal(t, fileDiffs[fileName], result[fileName])}func TestFileDiffRefinerFork(t *testing.T) {	fd1 := fixtureFileDiffRefiner()	clones := fd1.Fork(1)	assert.Len(t, clones, 1)	fd2 := clones[0].(*FileDiffRefiner)	assert.True(t, fd1 == fd2)	fd1.Merge([]core.PipelineItem{fd2})}
 |