json_spec.lua 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. local helpers = require('test.functional.helpers')(after_each)
  2. local clear = helpers.clear
  3. local NIL = helpers.NIL
  4. local exec_lua = helpers.exec_lua
  5. local eq = helpers.eq
  6. describe('vim.json.decode function', function()
  7. before_each(function()
  8. clear()
  9. end)
  10. it('parses null, true, false', function()
  11. eq(NIL, exec_lua([[return vim.json.decode('null')]]))
  12. eq(true, exec_lua([[return vim.json.decode('true')]]))
  13. eq(false, exec_lua([[return vim.json.decode('false')]]))
  14. end)
  15. it('parses integer numbers', function()
  16. eq(100000, exec_lua([[return vim.json.decode('100000')]]))
  17. eq(-100000, exec_lua([[return vim.json.decode('-100000')]]))
  18. eq(100000, exec_lua([[return vim.json.decode(' 100000 ')]]))
  19. eq(-100000, exec_lua([[return vim.json.decode(' -100000 ')]]))
  20. eq(0, exec_lua([[return vim.json.decode('0')]]))
  21. eq(0, exec_lua([[return vim.json.decode('-0')]]))
  22. end)
  23. it('parses floating-point numbers', function()
  24. -- This behavior differs from vim.fn.json_decode, which return '100000.0'
  25. eq('100000', exec_lua([[return tostring(vim.json.decode('100000.0'))]]))
  26. eq(100000.5, exec_lua([[return vim.json.decode('100000.5')]]))
  27. eq(-100000.5, exec_lua([[return vim.json.decode('-100000.5')]]))
  28. eq(-100000.5e50, exec_lua([[return vim.json.decode('-100000.5e50')]]))
  29. eq(100000.5e50, exec_lua([[return vim.json.decode('100000.5e50')]]))
  30. eq(100000.5e50, exec_lua([[return vim.json.decode('100000.5e+50')]]))
  31. eq(-100000.5e-50, exec_lua([[return vim.json.decode('-100000.5e-50')]]))
  32. eq(100000.5e-50, exec_lua([[return vim.json.decode('100000.5e-50')]]))
  33. eq(100000e-50, exec_lua([[return vim.json.decode('100000e-50')]]))
  34. eq(0.5, exec_lua([[return vim.json.decode('0.5')]]))
  35. eq(0.005, exec_lua([[return vim.json.decode('0.005')]]))
  36. eq(0.005, exec_lua([[return vim.json.decode('0.00500')]]))
  37. eq(0.5, exec_lua([[return vim.json.decode('0.00500e+002')]]))
  38. eq(0.00005, exec_lua([[return vim.json.decode('0.00500e-002')]]))
  39. eq(-0.0, exec_lua([[return vim.json.decode('-0.0')]]))
  40. eq(-0.0, exec_lua([[return vim.json.decode('-0.0e0')]]))
  41. eq(-0.0, exec_lua([[return vim.json.decode('-0.0e+0')]]))
  42. eq(-0.0, exec_lua([[return vim.json.decode('-0.0e-0')]]))
  43. eq(-0.0, exec_lua([[return vim.json.decode('-0e-0')]]))
  44. eq(-0.0, exec_lua([[return vim.json.decode('-0e-2')]]))
  45. eq(-0.0, exec_lua([[return vim.json.decode('-0e+2')]]))
  46. eq(0.0, exec_lua([[return vim.json.decode('0.0')]]))
  47. eq(0.0, exec_lua([[return vim.json.decode('0.0e0')]]))
  48. eq(0.0, exec_lua([[return vim.json.decode('0.0e+0')]]))
  49. eq(0.0, exec_lua([[return vim.json.decode('0.0e-0')]]))
  50. eq(0.0, exec_lua([[return vim.json.decode('0e-0')]]))
  51. eq(0.0, exec_lua([[return vim.json.decode('0e-2')]]))
  52. eq(0.0, exec_lua([[return vim.json.decode('0e+2')]]))
  53. end)
  54. it('parses containers', function()
  55. eq({1}, exec_lua([[return vim.json.decode('[1]')]]))
  56. eq({NIL, 1}, exec_lua([[return vim.json.decode('[null, 1]')]]))
  57. eq({['1']=2}, exec_lua([[return vim.json.decode('{"1": 2}')]]))
  58. eq({['1']=2, ['3']={{['4']={['5']={{}, 1}}}}},
  59. exec_lua([[return vim.json.decode('{"1": 2, "3": [{"4": {"5": [ [], 1]}}]}')]]))
  60. end)
  61. it('parses strings properly', function()
  62. eq('\n', exec_lua([=[return vim.json.decode([["\n"]])]=]))
  63. eq('', exec_lua([=[return vim.json.decode([[""]])]=]))
  64. eq('\\/"\t\b\n\r\f', exec_lua([=[return vim.json.decode([["\\\/\"\t\b\n\r\f"]])]=]))
  65. eq('/a', exec_lua([=[return vim.json.decode([["\/a"]])]=]))
  66. -- Unicode characters: 2-byte, 3-byte
  67. eq('«',exec_lua([=[return vim.json.decode([["«"]])]=]))
  68. eq('ફ',exec_lua([=[return vim.json.decode([["ફ"]])]=]))
  69. end)
  70. it('parses surrogate pairs properly', function()
  71. eq('\240\144\128\128', exec_lua([[return vim.json.decode('"\\uD800\\uDC00"')]]))
  72. end)
  73. it('accepts all spaces in every position where space may be put', function()
  74. local s = ' \t\n\r \t\r\n \n\t\r \n\r\t \r\t\n \r\n\t\t \n\r\t \r\n\t\n \r\t\n\r \t\r \n\t\r\n \n \t\r\n \r\t\n\t \r\n\t\r \n\r \t\n\r\t \r \t\n\r \n\t\r\t \n\r\t\n \r\n \t\r\n\t'
  75. local str = ('%s{%s"key"%s:%s[%s"val"%s,%s"val2"%s]%s,%s"key2"%s:%s1%s}%s'):gsub('%%s', s)
  76. eq({key={'val', 'val2'}, key2=1}, exec_lua([[return vim.json.decode(...)]], str))
  77. end)
  78. end)
  79. describe('vim.json.encode function', function()
  80. before_each(function()
  81. clear()
  82. end)
  83. it('dumps strings', function()
  84. eq('"Test"', exec_lua([[return vim.json.encode('Test')]]))
  85. eq('""', exec_lua([[return vim.json.encode('')]]))
  86. eq('"\\t"', exec_lua([[return vim.json.encode('\t')]]))
  87. eq('"\\n"', exec_lua([[return vim.json.encode('\n')]]))
  88. -- vim.fn.json_encode return \\u001B
  89. eq('"\\u001b"', exec_lua([[return vim.json.encode('\27')]]))
  90. eq('"þÿþ"', exec_lua([[return vim.json.encode('þÿþ')]]))
  91. end)
  92. it('dumps numbers', function()
  93. eq('0', exec_lua([[return vim.json.encode(0)]]))
  94. eq('10', exec_lua([[return vim.json.encode(10)]]))
  95. eq('-10', exec_lua([[return vim.json.encode(-10)]]))
  96. end)
  97. it('dumps floats', function()
  98. eq('10.5', exec_lua([[return vim.json.encode(10.5)]]))
  99. eq('-10.5', exec_lua([[return vim.json.encode(-10.5)]]))
  100. eq('-1e-05', exec_lua([[return vim.json.encode(-1e-5)]]))
  101. end)
  102. it('dumps lists', function()
  103. eq('[]', exec_lua([[return vim.json.encode({})]]))
  104. eq('[[]]', exec_lua([[return vim.json.encode({{}})]]))
  105. eq('[[],[]]', exec_lua([[return vim.json.encode({{}, {}})]]))
  106. end)
  107. it('dumps dictionaries', function()
  108. eq('{}', exec_lua([[return vim.json.encode(vim.empty_dict())]]))
  109. eq('{"d":[]}', exec_lua([[return vim.json.encode({d={}})]]))
  110. end)
  111. it('dumps vim.NIL', function()
  112. eq('null', exec_lua([[return vim.json.encode(vim.NIL)]]))
  113. end)
  114. end)