diff_refiner_test.go 5.5 KB

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