matching.test.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. var syntax = require('zunit').syntax;
  2. var match = require('..').match;
  3. var parse = require('..').parse;
  4. var compile = require('..').matcher;
  5. var assert = require('assert');
  6. var Buffer = require('safe-buffer').Buffer;
  7. var suite = syntax.describe;
  8. var test = syntax.it;
  9. Object.prototype.AMQPLIB_ISSUE_453 = 123123123
  10. var INT_TESTS = [
  11. ['n:8',
  12. [[[255], 255]]],
  13. ['n:8/signed',
  14. [[[255], -1]]],
  15. ['n:1/unit:8',
  16. [[[129], 129]]],
  17. ['n:1/unit:8-signed',
  18. [[[129], -127]]],
  19. ['n:16',
  20. [[[1, 255], 511]]],
  21. ['n:16/signed',
  22. [[[255, 65], -191]]],
  23. ['n:16/little',
  24. [[[255, 1], 511]]],
  25. ['n:16/signed-little',
  26. [[[65, 255], -191]]],
  27. ['n:32',
  28. [[[45, 23, 97, 102], 756506982]]],
  29. ['n:32/signed',
  30. [[[245, 23, 97, 102], -183017114]]],
  31. ['n:32/little',
  32. [[[245, 23, 97, 102], 1717639157]]],
  33. ['n:32/signed-little',
  34. [[[245, 23, 97, 129], -2124343307]]],
  35. ['n:4/signed-little-unit:8',
  36. [[[245, 23, 97, 129], -2124343307]]],
  37. ['n:64',
  38. [[[1,2,3,4,5,6,7,8], 72623859790382856]]],
  39. ['n:64/signed',
  40. [[[255,2,3,4,5,6,7,8], -71491328285473016]]],
  41. ['n:64/little',
  42. [[[1,2,3,4,5,6,7,8], 578437695752307201]]],
  43. ['n:64/little-signed',
  44. [[[1,2,3,4,5,6,7,255], -70080650589044223]]],
  45. ['n:8/signed-unit:8-little',
  46. [[[1,2,3,4,5,6,7,255], -70080650589044223]]],
  47. ];
  48. suite("Integer",
  49. function() {
  50. INT_TESTS.forEach(function(p) {
  51. var pattern = parse(p[0]);
  52. var cpattern = compile(p[0]);
  53. p[1].forEach(function(tc) {
  54. test(p[0], function() {
  55. assert.deepEqual({n: tc[1]}, match(pattern, Buffer.from(tc[0])));
  56. });
  57. test(p[0], function() {
  58. assert.deepEqual({n: tc[1]}, cpattern(Buffer.from(tc[0])));
  59. });
  60. });
  61. });
  62. });
  63. // test cases largely constructed in Erlang using e.g.,
  64. // Pi = math:pi(), <<Pi:32/float>>.
  65. FLOAT_TESTS = [
  66. ['n:32/float',
  67. [[[64,73,15,219], Math.PI],
  68. [[0, 0, 0, 0], 0.0 ]]],
  69. ['n:64/float',
  70. [[[64,9,33,251,84,68,45,24], Math.PI],
  71. [[0, 0, 0, 0, 0, 0, 0, 0], 0.0]]],
  72. ['n:32/float-little',
  73. [[[219, 15, 73, 64], Math.PI],
  74. [[0, 0, 0, 0], 0.0]]],
  75. ['n:64/float-little',
  76. [[[24, 45, 68, 84, 251, 33, 9, 64], Math.PI],
  77. [[0, 0, 0, 0, 0, 0, 0, 0], 0.0]]],
  78. ['n:4/float-unit:8',
  79. [[[64,73,15,219], Math.PI],
  80. [[0, 0, 0, 0], 0.0]]]
  81. ];
  82. suite("Float",
  83. function() {
  84. var precision = 0.00001;
  85. FLOAT_TESTS.forEach(function(p) {
  86. var pattern = parse(p[0]);
  87. var cpattern = compile(p[0]);
  88. p[1].forEach(function(tc) {
  89. test(p[0], function() {
  90. var m = match(pattern, Buffer.from(tc[0]));
  91. assert.ok(m.n !== undefined);
  92. assert.ok(Math.abs(tc[1] - m.n) < precision);
  93. });
  94. test(p[0], function() {
  95. var m = cpattern(Buffer.from(tc[0]));
  96. assert.ok(m.n !== undefined);
  97. assert.ok(Math.abs(tc[1] - m.n) < precision);
  98. });
  99. });
  100. });
  101. });
  102. BINARY_TESTS = [
  103. ['n:0/unit:8-binary', []],
  104. ['n:1/unit:8-binary', [93]],
  105. ['n:5/unit:8-binary', [1, 2, 3, 4, 5]],
  106. ['n:32/unit:1-binary', [255, 254, 253, 252]]
  107. ];
  108. suite("Binary",
  109. function() {
  110. BINARY_TESTS.forEach(function(p) {
  111. var pattern = parse(p[0]);
  112. var cpattern = compile(p[0]);
  113. var prest = p[0] + ', _/binary';
  114. var patternrest = parse(prest);
  115. var cpatternrest = compile(prest);
  116. test(p[0], function() {
  117. assert.deepEqual({n: Buffer.from(p[1])},
  118. match(pattern, Buffer.from(p[1])));
  119. assert.deepEqual({n: Buffer.from(p[1])},
  120. cpattern(Buffer.from(p[1])));
  121. });
  122. test(prest, function() {
  123. var plusgarbage = p[1].concat([5, 98, 23, 244]);
  124. assert.deepEqual({n: Buffer.from(p[1])},
  125. match(patternrest, Buffer.from(plusgarbage)));
  126. assert.deepEqual({n: Buffer.from(p[1])},
  127. cpatternrest(Buffer.from(plusgarbage)));
  128. });
  129. });
  130. });
  131. var VAR_TESTS = [
  132. ['size, n:size',
  133. [[[8, 5], 5],
  134. [[32, 0, 0, 0, 167], 167]]],
  135. ['size, n:size/binary',
  136. [[[2, 5, 6], Buffer.from([5, 6])]]],
  137. ['a, b:a, n:b',
  138. [[[8, 32, 0, 0, 2, 100], 612]]]
  139. ];
  140. suite("Environment",
  141. function() {
  142. VAR_TESTS.forEach(function(p) {
  143. var pattern = parse(p[0]);
  144. var cpattern = compile(p[0]);
  145. p[1].forEach(function(tc) {
  146. test(p[0], function() {
  147. assert.deepEqual(tc[1], match(pattern, Buffer.from(tc[0])).n);
  148. });
  149. test(p[0], function() {
  150. assert.deepEqual(tc[1], cpattern(Buffer.from(tc[0])).n);
  151. });
  152. });
  153. });
  154. });
  155. STRING_TESTS = [
  156. ['"foobar", n:8', "foobarA", 'A'.charCodeAt(0)],
  157. ['n:8, "foobar", _/binary', "CfoobarGARBAGE", 'C'.charCodeAt(0)],
  158. ['"foo, :-bar\\"", n:8, "another"', 'foo, :-bar"Zanother', 'Z'.charCodeAt(0)]
  159. ];
  160. suite("String",
  161. function() {
  162. STRING_TESTS.forEach(function(p) {
  163. var pattern = parse(p[0]);
  164. test(p[0], function() {
  165. var res = match(pattern, Buffer.from(p[1]));
  166. assert.equal(res.n, p[2]);
  167. });
  168. });
  169. });