lexer_specs.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import {describe, it, expect} from 'test/lib/common';
  2. import {Lexer} from '../lexer';
  3. describe('when lexing graphite expression', function() {
  4. it('should tokenize metric expression', function() {
  5. var lexer = new Lexer('metric.test.*.asd.count');
  6. var tokens = lexer.tokenize();
  7. expect(tokens[0].value).to.be('metric');
  8. expect(tokens[1].value).to.be('.');
  9. expect(tokens[2].type).to.be('identifier');
  10. expect(tokens[4].type).to.be('identifier');
  11. expect(tokens[4].pos).to.be(13);
  12. });
  13. it('should tokenize metric expression with dash', function() {
  14. var lexer = new Lexer('metric.test.se1-server-*.asd.count');
  15. var tokens = lexer.tokenize();
  16. expect(tokens[4].type).to.be('identifier');
  17. expect(tokens[4].value).to.be('se1-server-*');
  18. });
  19. it('should tokenize metric expression with dash2', function() {
  20. var lexer = new Lexer('net.192-168-1-1.192-168-1-9.ping_value.*');
  21. var tokens = lexer.tokenize();
  22. expect(tokens[0].value).to.be('net');
  23. expect(tokens[2].value).to.be('192-168-1-1');
  24. });
  25. it('should tokenize metric expression with equal sign', function() {
  26. var lexer = new Lexer('apps=test');
  27. var tokens = lexer.tokenize();
  28. expect(tokens[0].value).to.be('apps=test');
  29. });
  30. it('simple function2', function() {
  31. var lexer = new Lexer('offset(test.metric, -100)');
  32. var tokens = lexer.tokenize();
  33. expect(tokens[2].type).to.be('identifier');
  34. expect(tokens[4].type).to.be('identifier');
  35. expect(tokens[6].type).to.be('number');
  36. });
  37. it('should tokenize metric expression with curly braces', function() {
  38. var lexer = new Lexer('metric.se1-{first, second}.count');
  39. var tokens = lexer.tokenize();
  40. expect(tokens.length).to.be(10);
  41. expect(tokens[3].type).to.be('{');
  42. expect(tokens[4].value).to.be('first');
  43. expect(tokens[5].value).to.be(',');
  44. expect(tokens[6].value).to.be('second');
  45. });
  46. it('should tokenize metric expression with number segments', function() {
  47. var lexer = new Lexer("metric.10.12_10.test");
  48. var tokens = lexer.tokenize();
  49. expect(tokens[0].type).to.be('identifier');
  50. expect(tokens[2].type).to.be('identifier');
  51. expect(tokens[2].value).to.be('10');
  52. expect(tokens[4].value).to.be('12_10');
  53. expect(tokens[4].type).to.be('identifier');
  54. });
  55. it('should tokenize metric expression with segment that start with number', function() {
  56. var lexer = new Lexer("metric.001-server");
  57. var tokens = lexer.tokenize();
  58. expect(tokens[0].type).to.be('identifier');
  59. expect(tokens[2].type).to.be('identifier');
  60. expect(tokens.length).to.be(3);
  61. });
  62. it('should tokenize func call with numbered metric and number arg', function() {
  63. var lexer = new Lexer("scale(metric.10, 15)");
  64. var tokens = lexer.tokenize();
  65. expect(tokens[0].type).to.be('identifier');
  66. expect(tokens[2].type).to.be('identifier');
  67. expect(tokens[2].value).to.be('metric');
  68. expect(tokens[4].value).to.be('10');
  69. expect(tokens[4].type).to.be('number');
  70. expect(tokens[6].type).to.be('number');
  71. });
  72. it('should tokenize metric with template parameter', function() {
  73. var lexer = new Lexer("metric.[[server]].test");
  74. var tokens = lexer.tokenize();
  75. expect(tokens[2].type).to.be('identifier');
  76. expect(tokens[2].value).to.be('[[server]]');
  77. expect(tokens[4].type).to.be('identifier');
  78. });
  79. it('should tokenize metric with question mark', function() {
  80. var lexer = new Lexer("metric.server_??.test");
  81. var tokens = lexer.tokenize();
  82. expect(tokens[2].type).to.be('identifier');
  83. expect(tokens[2].value).to.be('server_??');
  84. expect(tokens[4].type).to.be('identifier');
  85. });
  86. it('should handle error with unterminated string', function() {
  87. var lexer = new Lexer("alias(metric, 'asd)");
  88. var tokens = lexer.tokenize();
  89. expect(tokens[0].value).to.be('alias');
  90. expect(tokens[1].value).to.be('(');
  91. expect(tokens[2].value).to.be('metric');
  92. expect(tokens[3].value).to.be(',');
  93. expect(tokens[4].type).to.be('string');
  94. expect(tokens[4].isUnclosed).to.be(true);
  95. expect(tokens[4].pos).to.be(20);
  96. });
  97. it('should handle float parameters', function() {
  98. var lexer = new Lexer("alias(metric, 0.002)");
  99. var tokens = lexer.tokenize();
  100. expect(tokens[4].type).to.be('number');
  101. expect(tokens[4].value).to.be('0.002');
  102. });
  103. it('should handle bool parameters', function() {
  104. var lexer = new Lexer("alias(metric, true, false)");
  105. var tokens = lexer.tokenize();
  106. expect(tokens[4].type).to.be('bool');
  107. expect(tokens[4].value).to.be('true');
  108. expect(tokens[6].type).to.be('bool');
  109. });
  110. });