diff_refiner_test.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. package uast
  2. import (
  3. "io/ioutil"
  4. "os"
  5. "path"
  6. "testing"
  7. "unicode/utf8"
  8. "github.com/sergi/go-diff/diffmatchpatch"
  9. "github.com/stretchr/testify/assert"
  10. "gopkg.in/bblfsh/sdk.v2/uast/nodes"
  11. "gopkg.in/bblfsh/sdk.v2/uast/nodes/nodesproto"
  12. "gopkg.in/src-d/go-git.v4/plumbing/object"
  13. "gopkg.in/src-d/hercules.v9/internal/core"
  14. "gopkg.in/src-d/hercules.v9/internal/plumbing"
  15. "gopkg.in/src-d/hercules.v9/internal/test"
  16. )
  17. func fixtureFileDiffRefiner() *FileDiffRefiner {
  18. fd := &FileDiffRefiner{}
  19. fd.Initialize(test.Repository)
  20. return fd
  21. }
  22. func TestFileDiffRefinerMeta(t *testing.T) {
  23. fd := fixtureFileDiffRefiner()
  24. assert.Equal(t, fd.Name(), "FileDiffRefiner")
  25. assert.Equal(t, len(fd.Provides()), 1)
  26. assert.Equal(t, fd.Provides()[0], plumbing.DependencyFileDiff)
  27. assert.Equal(t, len(fd.Requires()), 2)
  28. assert.Equal(t, fd.Requires()[0], plumbing.DependencyFileDiff)
  29. assert.Equal(t, fd.Requires()[1], DependencyUastChanges)
  30. assert.Len(t, fd.ListConfigurationOptions(), 0)
  31. fd.Configure(nil)
  32. features := fd.Features()
  33. assert.Len(t, features, 1)
  34. assert.Equal(t, features[0], FeatureUast)
  35. }
  36. func TestFileDiffRefinerRegistration(t *testing.T) {
  37. summoned := core.Registry.Summon((&FileDiffRefiner{}).Name())
  38. assert.Len(t, summoned, 1)
  39. assert.Equal(t, summoned[0].Name(), "FileDiffRefiner")
  40. summoned = core.Registry.Summon((&FileDiffRefiner{}).Provides()[0])
  41. assert.True(t, len(summoned) >= 1)
  42. matched := false
  43. for _, tp := range summoned {
  44. matched = matched || tp.Name() == "FileDiffRefiner"
  45. }
  46. assert.True(t, matched)
  47. }
  48. func loadUast(t *testing.T, name string) nodes.Node {
  49. filename := path.Join("..", "..", "test_data", name)
  50. reader, err := os.Open(filename)
  51. if err != nil {
  52. assert.Failf(t, "cannot load %s: %v", filename, err)
  53. }
  54. node, err := nodesproto.ReadTree(reader)
  55. if err != nil {
  56. assert.Failf(t, "cannot load %s: %v", filename, err)
  57. }
  58. return node
  59. }
  60. func TestFileDiffRefinerConsume(t *testing.T) {
  61. bytes1, err := ioutil.ReadFile(path.Join("..", "..", "test_data", "1.java"))
  62. assert.Nil(t, err)
  63. bytes2, err := ioutil.ReadFile(path.Join("..", "..", "test_data", "2.java"))
  64. assert.Nil(t, err)
  65. dmp := diffmatchpatch.New()
  66. src, dst, _ := dmp.DiffLinesToRunes(string(bytes1), string(bytes2))
  67. state := map[string]interface{}{}
  68. fileDiffs := map[string]plumbing.FileDiffData{}
  69. const fileName = "test.java"
  70. fileDiffs[fileName] = plumbing.FileDiffData{
  71. OldLinesOfCode: len(src),
  72. NewLinesOfCode: len(dst),
  73. Diffs: dmp.DiffMainRunes(src, dst, false),
  74. }
  75. state[plumbing.DependencyFileDiff] = fileDiffs
  76. uastChanges := make([]Change, 1)
  77. state[DependencyUastChanges] = uastChanges
  78. uastChanges[0] = Change{
  79. Change: &object.Change{
  80. From: object.ChangeEntry{Name: fileName},
  81. To: object.ChangeEntry{Name: fileName}},
  82. Before: loadUast(t, "uast1.pb"), After: loadUast(t, "uast2.pb"),
  83. }
  84. fd := fixtureFileDiffRefiner()
  85. iresult, err := fd.Consume(state)
  86. assert.Nil(t, err)
  87. result := iresult[plumbing.DependencyFileDiff].(map[string]plumbing.FileDiffData)
  88. assert.Len(t, result, 1)
  89. oldDiff := fileDiffs[fileName]
  90. newDiff := result[fileName]
  91. assert.Equal(t, oldDiff.OldLinesOfCode, newDiff.OldLinesOfCode)
  92. assert.Equal(t, oldDiff.NewLinesOfCode, newDiff.NewLinesOfCode)
  93. assert.Equal(t, len(oldDiff.Diffs)+1, len(newDiff.Diffs))
  94. assert.Equal(t, dmp.DiffText2(oldDiff.Diffs), dmp.DiffText2(newDiff.Diffs))
  95. // Some hardcoded length checks
  96. assert.Equal(t, utf8.RuneCountInString(newDiff.Diffs[6].Text), 11)
  97. assert.Equal(t, utf8.RuneCountInString(newDiff.Diffs[7].Text), 41)
  98. assert.Equal(t, utf8.RuneCountInString(newDiff.Diffs[8].Text), 231)
  99. }
  100. func TestFileDiffRefinerConsumeNoUast(t *testing.T) {
  101. bytes1, err := ioutil.ReadFile(path.Join("..", "..", "test_data", "1.java"))
  102. assert.Nil(t, err)
  103. bytes2, err := ioutil.ReadFile(path.Join("..", "..", "test_data", "2.java"))
  104. assert.Nil(t, err)
  105. dmp := diffmatchpatch.New()
  106. src, dst, _ := dmp.DiffLinesToRunes(string(bytes1), string(bytes2))
  107. state := map[string]interface{}{}
  108. fileDiffs := map[string]plumbing.FileDiffData{}
  109. const fileName = "test.java"
  110. fileDiffs[fileName] = plumbing.FileDiffData{
  111. OldLinesOfCode: len(src),
  112. NewLinesOfCode: len(dst),
  113. Diffs: dmp.DiffMainRunes(src, dst, false),
  114. }
  115. state[plumbing.DependencyFileDiff] = fileDiffs
  116. uastChanges := make([]Change, 1)
  117. state[DependencyUastChanges] = uastChanges
  118. uastChanges[0] = Change{
  119. Change: &object.Change{
  120. From: object.ChangeEntry{Name: fileName},
  121. To: object.ChangeEntry{Name: fileName}},
  122. Before: loadUast(t, "uast1.pb"), After: nil,
  123. }
  124. fd := fixtureFileDiffRefiner()
  125. iresult, err := fd.Consume(state)
  126. assert.Nil(t, err)
  127. result := iresult[plumbing.DependencyFileDiff].(map[string]plumbing.FileDiffData)
  128. assert.Len(t, result, 1)
  129. assert.Equal(t, fileDiffs[fileName], result[fileName])
  130. fileDiffs[fileName] = plumbing.FileDiffData{
  131. OldLinesOfCode: 100,
  132. NewLinesOfCode: 100,
  133. Diffs: []diffmatchpatch.Diff{{}},
  134. }
  135. uastChanges[0] = Change{
  136. Change: &object.Change{
  137. From: object.ChangeEntry{Name: fileName},
  138. To: object.ChangeEntry{Name: fileName}},
  139. Before: loadUast(t, "uast1.pb"), After: loadUast(t, "uast2.pb"),
  140. }
  141. iresult, err = fd.Consume(state)
  142. assert.Nil(t, err)
  143. result = iresult[plumbing.DependencyFileDiff].(map[string]plumbing.FileDiffData)
  144. assert.Len(t, result, 1)
  145. assert.Equal(t, fileDiffs[fileName], result[fileName])
  146. }
  147. func TestFileDiffRefinerFork(t *testing.T) {
  148. fd1 := fixtureFileDiffRefiner()
  149. clones := fd1.Fork(1)
  150. assert.Len(t, clones, 1)
  151. fd2 := clones[0].(*FileDiffRefiner)
  152. assert.True(t, fd1 == fd2)
  153. fd1.Merge([]core.PipelineItem{fd2})
  154. }