syntax-scope-map-spec.js 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. const SyntaxScopeMap = require('../src/syntax-scope-map');
  2. describe('SyntaxScopeMap', () => {
  3. it('can match immediate child selectors', () => {
  4. const map = new SyntaxScopeMap({
  5. 'a > b > c': 'x',
  6. 'b > c': 'y',
  7. c: 'z'
  8. });
  9. expect(map.get(['a', 'b', 'c'], [0, 0, 0])).toBe('x');
  10. expect(map.get(['d', 'b', 'c'], [0, 0, 0])).toBe('y');
  11. expect(map.get(['d', 'e', 'c'], [0, 0, 0])).toBe('z');
  12. expect(map.get(['e', 'c'], [0, 0, 0])).toBe('z');
  13. expect(map.get(['c'], [0, 0, 0])).toBe('z');
  14. expect(map.get(['d'], [0, 0, 0])).toBe(undefined);
  15. });
  16. it('can match :nth-child pseudo-selectors on leaves', () => {
  17. const map = new SyntaxScopeMap({
  18. 'a > b': 'w',
  19. 'a > b:nth-child(1)': 'x',
  20. b: 'y',
  21. 'b:nth-child(2)': 'z'
  22. });
  23. expect(map.get(['a', 'b'], [0, 0])).toBe('w');
  24. expect(map.get(['a', 'b'], [0, 1])).toBe('x');
  25. expect(map.get(['a', 'b'], [0, 2])).toBe('w');
  26. expect(map.get(['b'], [0])).toBe('y');
  27. expect(map.get(['b'], [1])).toBe('y');
  28. expect(map.get(['b'], [2])).toBe('z');
  29. });
  30. it('can match :nth-child pseudo-selectors on interior nodes', () => {
  31. const map = new SyntaxScopeMap({
  32. 'b:nth-child(1) > c': 'w',
  33. 'a > b > c': 'x',
  34. 'a > b:nth-child(2) > c': 'y'
  35. });
  36. expect(map.get(['b', 'c'], [0, 0])).toBe(undefined);
  37. expect(map.get(['b', 'c'], [1, 0])).toBe('w');
  38. expect(map.get(['a', 'b', 'c'], [1, 0, 0])).toBe('x');
  39. expect(map.get(['a', 'b', 'c'], [1, 2, 0])).toBe('y');
  40. });
  41. it('allows anonymous tokens to be referred to by their string value', () => {
  42. const map = new SyntaxScopeMap({
  43. '"b"': 'w',
  44. 'a > "b"': 'x',
  45. 'a > "b":nth-child(1)': 'y',
  46. '"\\""': 'z'
  47. });
  48. expect(map.get(['b'], [0], true)).toBe(undefined);
  49. expect(map.get(['b'], [0], false)).toBe('w');
  50. expect(map.get(['a', 'b'], [0, 0], false)).toBe('x');
  51. expect(map.get(['a', 'b'], [0, 1], false)).toBe('y');
  52. expect(map.get(['a', '"'], [0, 1], false)).toBe('z');
  53. });
  54. it('supports the wildcard selector', () => {
  55. const map = new SyntaxScopeMap({
  56. '*': 'w',
  57. 'a > *': 'x',
  58. 'a > *:nth-child(1)': 'y',
  59. 'a > *:nth-child(1) > b': 'z'
  60. });
  61. expect(map.get(['b'], [0])).toBe('w');
  62. expect(map.get(['c'], [0])).toBe('w');
  63. expect(map.get(['a', 'b'], [0, 0])).toBe('x');
  64. expect(map.get(['a', 'b'], [0, 1])).toBe('y');
  65. expect(map.get(['a', 'c'], [0, 1])).toBe('y');
  66. expect(map.get(['a', 'c', 'b'], [0, 1, 1])).toBe('z');
  67. expect(map.get(['a', 'c', 'b'], [0, 2, 1])).toBe('w');
  68. });
  69. it('distinguishes between an anonymous * token and the wildcard selector', () => {
  70. const map = new SyntaxScopeMap({
  71. '"*"': 'x',
  72. 'a > "b"': 'y'
  73. });
  74. expect(map.get(['b'], [0], false)).toBe(undefined);
  75. expect(map.get(['*'], [0], false)).toBe('x');
  76. });
  77. });