changes_xpather_test.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // +build !disable_babelfish
  2. package hercules
  3. import (
  4. "io/ioutil"
  5. "log"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. "gopkg.in/bblfsh/client-go.v2"
  9. "gopkg.in/bblfsh/sdk.v1/uast"
  10. "gopkg.in/src-d/go-git.v4/plumbing"
  11. "gopkg.in/src-d/go-git.v4/plumbing/object"
  12. )
  13. func TestChangesXPatherExtractChanged(t *testing.T) {
  14. client, err := bblfsh.NewClient("0.0.0.0:9432")
  15. if err != nil {
  16. log.Panicf("Failed to connect to the Babelfish server at 0.0.0.0:9432: %v", err)
  17. }
  18. hash1 := "a98a6940eb4cfb1eb635c3232485a75c4b63fff3"
  19. hash2 := "42457dc695fa73ec9621b47832d5711f6325410d"
  20. root1 := parseBlobFromTestRepo(hash1, "burndown.go", client)
  21. root2 := parseBlobFromTestRepo(hash2, "burndown.go", client)
  22. gitChange := fakeChangeForName("burndown.go", hash1, hash2)
  23. uastChanges := []UASTChange{
  24. {Before: root1, After: root2, Change: gitChange},
  25. {Before: nil, After: root2, Change: gitChange},
  26. {Before: root1, After: nil, Change: gitChange},
  27. }
  28. xpather := ChangesXPather{XPath: "//*[@roleComment]"}
  29. nodes := xpather.Extract(uastChanges)
  30. assert.True(t, len(nodes) > 0)
  31. }
  32. func parseBlobFromTestRepo(hash, name string, client *bblfsh.Client) *uast.Node {
  33. blob, err := testRepository.BlobObject(plumbing.NewHash(hash))
  34. if err != nil {
  35. panic(err)
  36. }
  37. reader, err := blob.Reader()
  38. if err != nil {
  39. panic(err)
  40. }
  41. defer reader.Close()
  42. data, err := ioutil.ReadAll(reader)
  43. if err != nil {
  44. panic(err)
  45. }
  46. request := client.NewParseRequest()
  47. request.Content(string(data))
  48. request.Filename(name)
  49. response, err := request.Do()
  50. if err != nil {
  51. panic(err)
  52. }
  53. return response.UAST
  54. }
  55. func fakeChangeForName(name string, hashFrom string, hashTo string) *object.Change {
  56. return &object.Change{
  57. From: object.ChangeEntry{Name: name, TreeEntry: object.TreeEntry{
  58. Name: name, Hash: plumbing.NewHash(hashFrom),
  59. }},
  60. To: object.ChangeEntry{Name: name, TreeEntry: object.TreeEntry{
  61. Name: name, Hash: plumbing.NewHash(hashTo),
  62. }},
  63. }
  64. }