git-spec.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. describe("Git grammars", function() {
  2. let grammar = null;
  3. beforeEach(() => waitsForPromise(() => atom.packages.activatePackage("language-git")));
  4. describe("Git configs", function() {
  5. beforeEach(() => grammar = atom.grammars.grammarForScopeName("source.git-config"));
  6. it("parses the Git config grammar", function() {
  7. expect(grammar).toBeTruthy();
  8. expect(grammar.scopeName).toBe("source.git-config");
  9. });
  10. });
  11. describe("Git commit messages", function() {
  12. const scopeNormal = ['text.git-commit', 'meta.scope.message.git-commit'];
  13. const scopeLeadingLowercase =
  14. ['text.git-commit', 'meta.scope.message.git-commit', 'invalid.illegal.first-char-should-be-uppercase.git-commit'];
  15. const scopeTrailingPeriod =
  16. ['text.git-commit', 'meta.scope.message.git-commit', 'invalid.illegal.subject-no-trailing-period.git-commit'];
  17. const scopeLineOver50 = ['text.git-commit', 'meta.scope.message.git-commit', 'invalid.deprecated.line-too-long.git-commit'];
  18. const scopeLineOver72 = ['text.git-commit', 'meta.scope.message.git-commit', 'invalid.illegal.line-too-long.git-commit'];
  19. beforeEach(() => grammar = atom.grammars.grammarForScopeName("text.git-commit"));
  20. it("parses the Git commit message grammar", function() {
  21. expect(grammar).toBeTruthy();
  22. expect(grammar.scopeName).toBe("text.git-commit");
  23. });
  24. it("highlights subject lines of less than 50 chars correctly", function() {
  25. let {tokens} = grammar.tokenizeLine("123456789012345678901234567890", null, true);
  26. expect(tokens[0]).toEqual({value: '123456789012345678901234567890', scopes: scopeNormal});
  27. ({tokens} = grammar.tokenizeLine("a23456789012345678901234567890", null, true));
  28. expect(tokens[0]).toEqual({value: 'a', scopes: scopeLeadingLowercase});
  29. expect(tokens[1]).toEqual({value: '23456789012345678901234567890', scopes: scopeNormal});
  30. ({tokens} = grammar.tokenizeLine("12345678901234567890123456789.", null, true));
  31. expect(tokens[0]).toEqual({value: '12345678901234567890123456789', scopes: scopeNormal});
  32. expect(tokens[1]).toEqual({value: '.', scopes: scopeTrailingPeriod});
  33. ({tokens} = grammar.tokenizeLine("b2345678901234567890123456789.", null, true));
  34. expect(tokens[0]).toEqual({value: 'b', scopes: scopeLeadingLowercase});
  35. expect(tokens[1]).toEqual({value: '2345678901234567890123456789', scopes: scopeNormal});
  36. expect(tokens[2]).toEqual({value: '.', scopes: scopeTrailingPeriod});
  37. });
  38. it("highlights subject lines of 50 chars correctly", function() {
  39. let {tokens} = grammar.tokenizeLine("12345678901234567890123456789012345678901234567890", null, true);
  40. expect(tokens[0]).toEqual({value: '12345678901234567890123456789012345678901234567890', scopes: scopeNormal});
  41. ({tokens} = grammar.tokenizeLine("c2345678901234567890123456789012345678901234567890", null, true));
  42. expect(tokens[0]).toEqual({value: 'c', scopes: scopeLeadingLowercase});
  43. expect(tokens[1]).toEqual({value: '2345678901234567890123456789012345678901234567890', scopes: scopeNormal});
  44. ({tokens} = grammar.tokenizeLine("1234567890123456789012345678901234567890123456789.", null, true));
  45. expect(tokens[0]).toEqual({value: '1234567890123456789012345678901234567890123456789', scopes: scopeNormal});
  46. expect(tokens[1]).toEqual({value: '.', scopes: scopeTrailingPeriod});
  47. ({tokens} = grammar.tokenizeLine("d234567890123456789012345678901234567890123456789.", null, true));
  48. expect(tokens[0]).toEqual({value: 'd', scopes: scopeLeadingLowercase});
  49. expect(tokens[1]).toEqual({value: '234567890123456789012345678901234567890123456789', scopes: scopeNormal});
  50. expect(tokens[2]).toEqual({value: '.', scopes: scopeTrailingPeriod});
  51. });
  52. it("highlights subject lines of 51 chars correctly", function() {
  53. let {tokens} = grammar.tokenizeLine("123456789012345678901234567890123456789012345678901", null, true);
  54. expect(tokens[0]).toEqual({value: '12345678901234567890123456789012345678901234567890', scopes: scopeNormal});
  55. expect(tokens[1]).toEqual({value: '1', scopes: scopeLineOver50});
  56. ({tokens} = grammar.tokenizeLine("e23456789012345678901234567890123456789012345678901", null, true));
  57. expect(tokens[0]).toEqual({value: 'e', scopes: scopeLeadingLowercase});
  58. expect(tokens[1]).toEqual({value: '2345678901234567890123456789012345678901234567890', scopes: scopeNormal});
  59. expect(tokens[2]).toEqual({value: '1', scopes: scopeLineOver50});
  60. ({tokens} = grammar.tokenizeLine("12345678901234567890123456789012345678901234567890.", null, true));
  61. expect(tokens[0]).toEqual({value: '12345678901234567890123456789012345678901234567890', scopes: scopeNormal});
  62. expect(tokens[1]).toEqual({value: '.', scopes: scopeTrailingPeriod});
  63. ({tokens} = grammar.tokenizeLine("f2345678901234567890123456789012345678901234567890.", null, true));
  64. expect(tokens[0]).toEqual({value: 'f', scopes: scopeLeadingLowercase});
  65. expect(tokens[1]).toEqual({value: '2345678901234567890123456789012345678901234567890', scopes: scopeNormal});
  66. expect(tokens[2]).toEqual({value: '.', scopes: scopeTrailingPeriod});
  67. });
  68. it("highlights subject lines of 72 chars correctly", function() {
  69. let {tokens} = grammar.tokenizeLine("123456789012345678901234567890123456789012345678901234567890123456789012", null, true);
  70. expect(tokens[0]).toEqual({value: '12345678901234567890123456789012345678901234567890', scopes: scopeNormal});
  71. expect(tokens[1]).toEqual({value: '123456789012345678901', scopes: scopeLineOver50});
  72. expect(tokens[2]).toEqual({value: '2', scopes: scopeLineOver50});
  73. ({tokens} = grammar.tokenizeLine("g23456789012345678901234567890123456789012345678901234567890123456789012", null, true));
  74. expect(tokens[0]).toEqual({value: 'g', scopes: scopeLeadingLowercase});
  75. expect(tokens[1]).toEqual({value: '2345678901234567890123456789012345678901234567890', scopes: scopeNormal});
  76. expect(tokens[2]).toEqual({value: '123456789012345678901', scopes: scopeLineOver50});
  77. expect(tokens[3]).toEqual({value: '2', scopes: scopeLineOver50});
  78. ({tokens} = grammar.tokenizeLine("12345678901234567890123456789012345678901234567890123456789012345678901.", null, true));
  79. expect(tokens[0]).toEqual({value: '12345678901234567890123456789012345678901234567890', scopes: scopeNormal});
  80. expect(tokens[1]).toEqual({value: '123456789012345678901', scopes: scopeLineOver50});
  81. expect(tokens[2]).toEqual({value: '.', scopes: scopeTrailingPeriod});
  82. ({tokens} = grammar.tokenizeLine("h2345678901234567890123456789012345678901234567890123456789012345678901.", null, true));
  83. expect(tokens[0]).toEqual({value: 'h', scopes: scopeLeadingLowercase});
  84. expect(tokens[1]).toEqual({value: '2345678901234567890123456789012345678901234567890', scopes: scopeNormal});
  85. expect(tokens[2]).toEqual({value: '123456789012345678901', scopes: scopeLineOver50});
  86. expect(tokens[3]).toEqual({value: '.', scopes: scopeTrailingPeriod});
  87. });
  88. it("highlights subject lines of 73 chars correctly", function() {
  89. let {tokens} = grammar.tokenizeLine("1234567890123456789012345678901234567890123456789012345678901234567890123", null, true);
  90. expect(tokens[0]).toEqual({value: '12345678901234567890123456789012345678901234567890', scopes: scopeNormal});
  91. expect(tokens[1]).toEqual({value: '1234567890123456789012', scopes: scopeLineOver50});
  92. expect(tokens[2]).toEqual({value: '3', scopes: scopeLineOver72});
  93. ({tokens} = grammar.tokenizeLine("i234567890123456789012345678901234567890123456789012345678901234567890123", null, true));
  94. expect(tokens[0]).toEqual({value: 'i', scopes: scopeLeadingLowercase});
  95. expect(tokens[1]).toEqual({value: '2345678901234567890123456789012345678901234567890', scopes: scopeNormal});
  96. expect(tokens[2]).toEqual({value: '1234567890123456789012', scopes: scopeLineOver50});
  97. expect(tokens[3]).toEqual({value: '3', scopes: scopeLineOver72});
  98. ({tokens} = grammar.tokenizeLine("123456789012345678901234567890123456789012345678901234567890123456789012.", null, true));
  99. expect(tokens[0]).toEqual({value: '12345678901234567890123456789012345678901234567890', scopes: scopeNormal});
  100. expect(tokens[1]).toEqual({value: '1234567890123456789012', scopes: scopeLineOver50});
  101. expect(tokens[2]).toEqual({value: '.', scopes: scopeTrailingPeriod});
  102. ({tokens} = grammar.tokenizeLine("j23456789012345678901234567890123456789012345678901234567890123456789012.", null, true));
  103. expect(tokens[0]).toEqual({value: 'j', scopes: scopeLeadingLowercase});
  104. expect(tokens[1]).toEqual({value: '2345678901234567890123456789012345678901234567890', scopes: scopeNormal});
  105. expect(tokens[2]).toEqual({value: '1234567890123456789012', scopes: scopeLineOver50});
  106. expect(tokens[3]).toEqual({value: '.', scopes: scopeTrailingPeriod});
  107. });
  108. it("highlights subject lines of over 73 chars correctly", function() {
  109. let {tokens} = grammar.tokenizeLine("123456789012345678901234567890123456789012345678901234567890123456789012345678", null, true);
  110. expect(tokens[0]).toEqual({value: '12345678901234567890123456789012345678901234567890', scopes: scopeNormal});
  111. expect(tokens[1]).toEqual({value: '1234567890123456789012', scopes: scopeLineOver50});
  112. expect(tokens[2]).toEqual({value: '345678', scopes: scopeLineOver72});
  113. ({tokens} = grammar.tokenizeLine("k23456789012345678901234567890123456789012345678901234567890123456789012345678", null, true));
  114. expect(tokens[0]).toEqual({value: 'k', scopes: scopeLeadingLowercase});
  115. expect(tokens[1]).toEqual({value: '2345678901234567890123456789012345678901234567890', scopes: scopeNormal});
  116. expect(tokens[2]).toEqual({value: '1234567890123456789012', scopes: scopeLineOver50});
  117. expect(tokens[3]).toEqual({value: '345678', scopes: scopeLineOver72});
  118. ({tokens} = grammar.tokenizeLine("123456789012345678901234567890123456789012345678901234567890123456789012345678.", null, true));
  119. expect(tokens[0]).toEqual({value: '12345678901234567890123456789012345678901234567890', scopes: scopeNormal});
  120. expect(tokens[1]).toEqual({value: '1234567890123456789012', scopes: scopeLineOver50});
  121. expect(tokens[2]).toEqual({value: '345678', scopes: scopeLineOver72});
  122. expect(tokens[3]).toEqual({value: '.', scopes: scopeTrailingPeriod});
  123. ({tokens} = grammar.tokenizeLine("m23456789012345678901234567890123456789012345678901234567890123456789012345678.", null, true));
  124. expect(tokens[0]).toEqual({value: 'm', scopes: scopeLeadingLowercase});
  125. expect(tokens[1]).toEqual({value: '2345678901234567890123456789012345678901234567890', scopes: scopeNormal});
  126. expect(tokens[2]).toEqual({value: '1234567890123456789012', scopes: scopeLineOver50});
  127. expect(tokens[3]).toEqual({value: '345678', scopes: scopeLineOver72});
  128. expect(tokens[4]).toEqual({value: '.', scopes: scopeTrailingPeriod});
  129. });
  130. });
  131. describe("Git rebases", function() {
  132. beforeEach(() => grammar = atom.grammars.grammarForScopeName("text.git-rebase"));
  133. it("parses the Git rebase message grammar", function() {
  134. expect(grammar).toBeTruthy();
  135. expect(grammar.scopeName).toBe("text.git-rebase");
  136. });
  137. for (var cmd of ["pick", "p", "reword", "r", "edit", "e", "squash", "s", "fixup", "f", "drop", "d"]) {
  138. it(`parses the ${cmd} command`, function() {
  139. const {tokens} = grammar.tokenizeLine(`${cmd} c0ffeee This is commit message`);
  140. expect(tokens[0]).toEqual({value: cmd, scopes: ["text.git-rebase", "meta.commit-command.git-rebase", "support.function.git-rebase"]});
  141. expect(tokens[1]).toEqual({value: " ", scopes: ["text.git-rebase", "meta.commit-command.git-rebase"]});
  142. expect(tokens[2]).toEqual({value: "c0ffeee", scopes: ["text.git-rebase", "meta.commit-command.git-rebase", "constant.sha.git-rebase"]});
  143. expect(tokens[3]).toEqual({value: " ", scopes: ["text.git-rebase", "meta.commit-command.git-rebase"]});
  144. expect(tokens[4]).toEqual({value: "This is commit message", scopes: ["text.git-rebase", "meta.commit-command.git-rebase", "meta.commit-message.git-rebase"]});
  145. });
  146. }
  147. it("parses the exec command", function() {
  148. let {tokens} = grammar.tokenizeLine("exec");
  149. expect(tokens[0]).toEqual({value: "exec", scopes: ["text.git-rebase", "meta.exec-command.git-rebase", "support.function.git-rebase"]});
  150. ({tokens} = grammar.tokenizeLine("x"));
  151. expect(tokens[0]).toEqual({value: "x", scopes: ["text.git-rebase", "meta.exec-command.git-rebase", "support.function.git-rebase"]});
  152. });
  153. it("includes language-shellscript highlighting when using the exec command", function() {
  154. waitsForPromise(() => atom.packages.activatePackage("language-shellscript"));
  155. return runs(function() {
  156. const {tokens} = grammar.tokenizeLine("exec echo 'Hello World'");
  157. expect(tokens[0]).toEqual({value: "exec", scopes: ["text.git-rebase", "meta.exec-command.git-rebase", "support.function.git-rebase"]});
  158. expect(tokens[1]).toEqual({value: " ", scopes: ["text.git-rebase", "meta.exec-command.git-rebase"]});
  159. expect(tokens[2]).toEqual({value: "echo", scopes: ["text.git-rebase", "meta.exec-command.git-rebase", "support.function.builtin.shell"]});});
  160. });
  161. });
  162. });