diff_refiner_test.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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[6].Text), 11)
  89. assert.Equal(t, utf8.RuneCountInString(newDiff.Diffs[7].Text), 41)
  90. assert.Equal(t, utf8.RuneCountInString(newDiff.Diffs[8].Text), 231)
  91. }
  92. func TestFileDiffRefinerConsumeNoUast(t *testing.T) {
  93. bytes1, err := ioutil.ReadFile(path.Join("test_data", "1.java"))
  94. assert.Nil(t, err)
  95. bytes2, err := ioutil.ReadFile(path.Join("test_data", "2.java"))
  96. assert.Nil(t, err)
  97. dmp := diffmatchpatch.New()
  98. src, dst, _ := dmp.DiffLinesToRunes(string(bytes1), string(bytes2))
  99. state := map[string]interface{}{}
  100. fileDiffs := map[string]FileDiffData{}
  101. const fileName = "test.java"
  102. fileDiffs[fileName] = FileDiffData{
  103. OldLinesOfCode: len(src),
  104. NewLinesOfCode: len(dst),
  105. Diffs: dmp.DiffMainRunes(src, dst, false),
  106. }
  107. state[DependencyFileDiff] = fileDiffs
  108. uastChanges := make([]UASTChange, 1)
  109. loadUast := func(name string) *uast.Node {
  110. bytes, err := ioutil.ReadFile(path.Join("test_data", name))
  111. assert.Nil(t, err)
  112. node := uast.Node{}
  113. proto.Unmarshal(bytes, &node)
  114. return &node
  115. }
  116. state[DependencyUastChanges] = uastChanges
  117. uastChanges[0] = UASTChange{
  118. Change: &object.Change{
  119. From: object.ChangeEntry{Name: fileName},
  120. To: object.ChangeEntry{Name: fileName}},
  121. Before: loadUast("uast1.pb"), After: nil,
  122. }
  123. fd := fixtureFileDiffRefiner()
  124. iresult, err := fd.Consume(state)
  125. assert.Nil(t, err)
  126. result := iresult[DependencyFileDiff].(map[string]FileDiffData)
  127. assert.Len(t, result, 1)
  128. assert.Equal(t, fileDiffs[fileName], result[fileName])
  129. fileDiffs[fileName] = FileDiffData{
  130. OldLinesOfCode: 100,
  131. NewLinesOfCode: 100,
  132. Diffs: []diffmatchpatch.Diff{{}},
  133. }
  134. uastChanges[0] = UASTChange{
  135. Change: &object.Change{
  136. From: object.ChangeEntry{Name: fileName},
  137. To: object.ChangeEntry{Name: fileName}},
  138. Before: loadUast("uast1.pb"), After: loadUast("uast2.pb"),
  139. }
  140. iresult, err = fd.Consume(state)
  141. assert.Nil(t, err)
  142. result = iresult[DependencyFileDiff].(map[string]FileDiffData)
  143. assert.Len(t, result, 1)
  144. assert.Equal(t, fileDiffs[fileName], result[fileName])
  145. }