directive_spec.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. var parse = require('../../../../src/parsers/directive').parse
  2. describe('Directive Parser', function () {
  3. it('simple', function () {
  4. var res = parse('exp')
  5. expect(res.length).toBe(1)
  6. expect(res[0].expression).toBe('exp')
  7. expect(res[0].raw).toBe('exp')
  8. })
  9. it('with arg', function () {
  10. var res = parse('arg:exp')
  11. expect(res.length).toBe(1)
  12. expect(res[0].expression).toBe('exp')
  13. expect(res[0].arg).toBe('arg')
  14. expect(res[0].raw).toBe('arg:exp')
  15. })
  16. it('with filters', function () {
  17. var res = parse(' arg : exp | abc de \'ok\' | bcd')
  18. expect(res.length).toBe(1)
  19. expect(res[0].expression).toBe('exp')
  20. expect(res[0].arg).toBe('arg')
  21. expect(res[0].raw).toBe('arg : exp | abc de \'ok\' | bcd')
  22. expect(res[0].filters.length).toBe(2)
  23. expect(res[0].filters[0].name).toBe('abc')
  24. expect(res[0].filters[0].args.length).toBe(2)
  25. expect(res[0].filters[0].args[0].value).toBe('de')
  26. expect(res[0].filters[0].args[0].dynamic).toBe(true)
  27. expect(res[0].filters[0].args[1].value).toBe('ok')
  28. expect(res[0].filters[0].args[1].dynamic).toBe(false)
  29. expect(res[0].filters[1].name).toBe('bcd')
  30. expect(res[0].filters[1].args).toBeUndefined()
  31. })
  32. it('double pipe', function () {
  33. var res = parse('a || b | c')
  34. expect(res.length).toBe(1)
  35. expect(res[0].expression).toBe('a || b')
  36. expect(res[0].raw).toBe('a || b | c')
  37. expect(res[0].filters.length).toBe(1)
  38. expect(res[0].filters[0].name).toBe('c')
  39. expect(res[0].filters[0].args).toBeUndefined()
  40. })
  41. it('single quote + boolean', function () {
  42. var res = parse('a ? \'b\' : c')
  43. expect(res.length).toBe(1)
  44. expect(res[0].expression).toBe('a ? \'b\' : c')
  45. expect(res[0].filters).toBeUndefined()
  46. })
  47. it('double quote + boolean', function () {
  48. var res = parse('"a:b:c||d|e|f" || d ? a : b')
  49. expect(res.length).toBe(1)
  50. expect(res[0].expression).toBe('"a:b:c||d|e|f" || d ? a : b')
  51. expect(res[0].filters).toBeUndefined()
  52. expect(res[0].arg).toBeUndefined()
  53. })
  54. it('multiple simple clauses', function () {
  55. var res = parse('a, b, c')
  56. expect(res.length).toBe(3)
  57. expect(res[0].expression).toBe('a')
  58. expect(res[1].expression).toBe('b')
  59. expect(res[2].expression).toBe('c')
  60. })
  61. it('multiple complex clauses', function () {
  62. var res = parse('a:b | c | j, d:e | f | k l, g:h | i "k"')
  63. expect(res.length).toBe(3)
  64. expect(res[0].arg).toBe('a')
  65. expect(res[0].expression).toBe('b')
  66. expect(res[0].filters.length).toBe(2)
  67. expect(res[0].filters[0].name).toBe('c')
  68. expect(res[0].filters[0].args).toBeUndefined()
  69. expect(res[0].filters[1].name).toBe('j')
  70. expect(res[0].filters[1].args).toBeUndefined()
  71. expect(res[1].arg).toBe('d')
  72. expect(res[1].expression).toBe('e')
  73. expect(res[1].filters.length).toBe(2)
  74. expect(res[1].filters[0].name).toBe('f')
  75. expect(res[1].filters[0].args).toBeUndefined()
  76. expect(res[1].filters[1].name).toBe('k')
  77. expect(res[1].filters[1].args.length).toBe(1)
  78. expect(res[1].filters[1].args[0].value).toBe('l')
  79. expect(res[1].filters[1].args[0].dynamic).toBe(true)
  80. expect(res[2].arg).toBe('g')
  81. expect(res[2].expression).toBe('h')
  82. expect(res[2].filters.length).toBe(1)
  83. expect(res[2].filters[0].name).toBe('i')
  84. expect(res[2].filters[0].args.length).toBe(1)
  85. expect(res[2].filters[0].args[0].value).toBe('k')
  86. expect(res[2].filters[0].args[0].dynamic).toBe(false)
  87. })
  88. it('nexted function calls + array/object literals', function () {
  89. var res = parse('click:test(c.indexOf(d,f),"e,f"), input: d || [e,f], ok:{a:1,b:2}')
  90. expect(res.length).toBe(3)
  91. expect(res[0].arg).toBe('click')
  92. expect(res[0].expression).toBe('test(c.indexOf(d,f),"e,f")')
  93. expect(res[1].arg).toBe('input')
  94. expect(res[1].expression).toBe('d || [e,f]')
  95. expect(res[1].filters).toBeUndefined()
  96. expect(res[2].arg).toBe('ok')
  97. expect(res[2].expression).toBe('{a:1,b:2}')
  98. })
  99. it('arguments with non-indentifier chars', function () {
  100. var res = parse('show.bs.collapse:test, a@b%c:test')
  101. expect(res.length).toBe(2)
  102. expect(res[0].arg).toBe('show.bs.collapse')
  103. expect(res[0].expression).toBe('test')
  104. expect(res[1].arg).toBe('a@b%c')
  105. expect(res[1].expression).toBe('test')
  106. })
  107. it('quoted arguments', function () {
  108. var res = parse('"xlink:href":a?"fsef":ff')
  109. expect(res.length).toBe(1)
  110. expect(res[0].arg).toBe('xlink:href')
  111. })
  112. it('cache', function () {
  113. var res1 = parse('a || b | c')
  114. var res2 = parse('a || b | c')
  115. expect(res1).toBe(res2)
  116. })
  117. })