diff_refiner_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package hercules
  2. import (
  3. "io/ioutil"
  4. "path"
  5. "testing"
  6. "unicode/utf8"
  7. "github.com/gogo/protobuf/proto"
  8. "github.com/sergi/go-diff/diffmatchpatch"
  9. "github.com/stretchr/testify/assert"
  10. "gopkg.in/bblfsh/sdk.v1/uast"
  11. "gopkg.in/src-d/go-git.v4/plumbing/object"
  12. )
  13. func fixtureFileDiffRefiner() *FileDiffRefiner {
  14. fd := &FileDiffRefiner{}
  15. fd.Initialize(testRepository)
  16. return fd
  17. }
  18. func TestFileDiffRefinerMeta(t *testing.T) {
  19. fd := fixtureFileDiffRefiner()
  20. assert.Equal(t, fd.Name(), "FileDiffRefiner")
  21. assert.Equal(t, len(fd.Provides()), 1)
  22. assert.Equal(t, fd.Provides()[0], DependencyFileDiff)
  23. assert.Equal(t, len(fd.Requires()), 2)
  24. assert.Equal(t, fd.Requires()[0], DependencyFileDiff)
  25. assert.Equal(t, fd.Requires()[1], DependencyUastChanges)
  26. assert.Len(t, fd.ListConfigurationOptions(), 0)
  27. fd.Configure(nil)
  28. features := fd.Features()
  29. assert.Len(t, features, 1)
  30. assert.Equal(t, features[0], FeatureUast)
  31. }
  32. func TestFileDiffRefinerRegistration(t *testing.T) {
  33. tp, exists := Registry.registered[(&FileDiffRefiner{}).Name()]
  34. assert.True(t, exists)
  35. assert.Equal(t, tp.Elem().Name(), "FileDiffRefiner")
  36. tps, exists := Registry.provided[(&FileDiffRefiner{}).Provides()[0]]
  37. assert.True(t, exists)
  38. assert.True(t, len(tps) >= 1)
  39. matched := false
  40. for _, tp := range tps {
  41. matched = matched || tp.Elem().Name() == "FileDiffRefiner"
  42. }
  43. assert.True(t, matched)
  44. }
  45. func TestFileDiffRefinerConsume(t *testing.T) {
  46. bytes1, err := ioutil.ReadFile(path.Join("test_data", "1.java"))
  47. assert.Nil(t, err)
  48. bytes2, err := ioutil.ReadFile(path.Join("test_data", "2.java"))
  49. assert.Nil(t, err)
  50. dmp := diffmatchpatch.New()
  51. src, dst, _ := dmp.DiffLinesToRunes(string(bytes1), string(bytes2))
  52. state := map[string]interface{}{}
  53. fileDiffs := map[string]FileDiffData{}
  54. const fileName = "test.java"
  55. fileDiffs[fileName] = FileDiffData{
  56. OldLinesOfCode: len(src),
  57. NewLinesOfCode: len(dst),
  58. Diffs: dmp.DiffMainRunes(src, dst, false),
  59. }
  60. state[DependencyFileDiff] = fileDiffs
  61. uastChanges := make([]UASTChange, 1)
  62. loadUast := func(name string) *uast.Node {
  63. bytes, err := ioutil.ReadFile(path.Join("test_data", name))
  64. assert.Nil(t, err)
  65. node := uast.Node{}
  66. proto.Unmarshal(bytes, &node)
  67. return &node
  68. }
  69. state[DependencyUastChanges] = uastChanges
  70. uastChanges[0] = UASTChange{
  71. Change: &object.Change{
  72. From: object.ChangeEntry{Name: fileName},
  73. To: object.ChangeEntry{Name: fileName}},
  74. Before: loadUast("uast1.pb"), After: loadUast("uast2.pb"),
  75. }
  76. fd := fixtureFileDiffRefiner()
  77. iresult, err := fd.Consume(state)
  78. assert.Nil(t, err)
  79. result := iresult[DependencyFileDiff].(map[string]FileDiffData)
  80. assert.Len(t, result, 1)
  81. oldDiff := fileDiffs[fileName]
  82. newDiff := result[fileName]
  83. assert.Equal(t, oldDiff.OldLinesOfCode, newDiff.OldLinesOfCode)
  84. assert.Equal(t, oldDiff.NewLinesOfCode, newDiff.NewLinesOfCode)
  85. assert.Equal(t, len(oldDiff.Diffs)+1, len(newDiff.Diffs))
  86. assert.Equal(t, dmp.DiffText2(oldDiff.Diffs), dmp.DiffText2(newDiff.Diffs))
  87. // Some hardcoded length checks
  88. assert.Equal(t, utf8.RuneCountInString(newDiff.Diffs[5].Text), 11)
  89. assert.Equal(t, utf8.RuneCountInString(newDiff.Diffs[6].Text), 41)
  90. assert.Equal(t, utf8.RuneCountInString(newDiff.Diffs[7].Text), 231)
  91. }