:: tests for lsp JSON parsing
/-  lsp-sur=language-server
/+  *test, *language-server-json
=,  enjs:format
|%
::
++  position
  [5 3]
++  position-jon
  ^-  json
  :-  %o
  %:  malt
    ['character' %n '3']
    ['line' %n '5']
    ~
  ==
::
++  range
  [position position]
::
++  range-jon
  ^-  json
  :-  %o
  %:  malt
    ['start' position-jon]
    ['end' position-jon]
    ~
  ==
::
++  change-jon
  ^-  json
  :-  %o
  %:  malt
    ['text' `json`[%s `@t`'text']]
    ['rangeLength' [%n '3']]
    ['range' range-jon]
    ~
  ==
::
++  changes-jon
  ^-  json
  :-  %a
  ^-  (list json)
  [change-jon ~]
::
++  text-document-item
  ^-  text-document-item:lsp-sur
  ['file://' `1 'text']
::
++  text-document-item-jon
  ^-  json
  :-  %o
  %:  malt
    ['uri' `json`[%s 'file://']]
    ['version' `json`[%n '1']]
    ['text' `json`[%s 'text']]
    ~
  ==
::
++  text-document-id
  ^-  versioned-doc-id:lsp-sur
  ['file://' `1]
::
++  text-document-id-jon
  ^-  json
  :-  %o
  %:  malt
    ['uri' `json`[%s 'file://']]
    ['version' `json`[%n '1']]
    ~
  ==
++  diagnostic
  ^-  diagnostic:lsp-sur
  [range 1 'Syntax Error']
::
++  diagnostic-jon
  ^-  json
  :-  %o
  %:  malt
    ['range' range-jon]
    ['severity' `json`[%n '1']]
    ['message' `json`[%s 'Syntax Error']]
    ~
  ==
::
++  completion-item
  ^-  completion-item:lsp-sur
  ['label' 1 'detail' 'doc' 'snippet' 1]
::
++  completion-item-jon
  ^-  json
  %:  pairs
    label+s+'label'
    detail+s+'detail'
    kind+n+'1'
    documentation+s+'doc'
    'insertText'^s+'snippet'
    'insertTextFormat'^n+'1'
    ~
  ==
::
++  make-notification-jon
  |=  [method=@t params=json]
  ^-  json
  %:  pairs
    ['method' `json`[%s method]]
    params+params
    ~
  ==
++  make-request-jon
  |=  [id=@t method=@t params=json]
  ^-  json
  %:  pairs
    ['id' `json`[%s id]]
    ['method' `json`[%s method]]
    params+params
    ~
  ==
++  make-response-jon
  |=  [id=@t result=json]
  %:  pairs
    id+s+id
    result+result
    ~
  ==
::
:: Notifications
::
++  test-parse-did-change
  %+  expect-eq
    !>  ^-  all:notification:lsp-sur
    [%text-document--did-change text-document-id [[~ [[5 3] [5 3]]] `3 'text']~]
  !>  %-  notification:dejs
  %+  make-notification-jon  'textDocument/didChange'
  :-  %o
  %:  malt
    ['contentChanges' changes-jon]
    ['textDocument' text-document-id-jon]
    ~
  ==
::
++  test-parse-did-save
  %+  expect-eq
    !>  ^-  all:notification:lsp-sur
    [%text-document--did-save text-document-id]
  !>  %-  notification:dejs
  %+  make-notification-jon  'textDocument/didSave'
  :-  %o
  %:  malt
    ['textDocument' text-document-id-jon]
    ~
  ==
::
++  test-parse-did-close
  %+  expect-eq
    !>  ^-  all:notification:lsp-sur
    [%text-document--did-close text-document-id]
  !>  %-  notification:dejs
  %+  make-notification-jon  'textDocument/didClose'
  :-  %o
  %:  malt
    ['textDocument' text-document-id-jon]
    ~
  ==
::
++  test-parse-did-open
  %+  expect-eq
    !>  ^-  all:notification:lsp-sur
    [%text-document--did-open text-document-item]
  !>  %-  notification:dejs
  %+  make-notification-jon  'textDocument/didOpen'
  :-  %o
  %:  malt
    ['textDocument' text-document-item-jon]
    ~
  ==
::
:: Requests
::
++  test-parse-hover
  %+  expect-eq
    !>  ^-  all:request:lsp-sur
    [%text-document--hover '3' position text-document-id]
  !>  %-  request:dejs
  ^-  json
  %^  make-request-jon  '3'  'textDocument/hover'
  :-  %o
  %:  malt
    ['position' position-jon]
    ['textDocument' text-document-id-jon]
    ~
  ==
++  test-parse-completion
  %+  expect-eq
    !>  ^-  all:request:lsp-sur
    [%text-document--completion '3' position text-document-id]
  !>  %-  request:dejs
  ^-  json
  %^  make-request-jon  '3'  'textDocument/completion'
  :-  %o
  %:  malt
    ['position' position-jon]
    ['textDocument' text-document-id-jon]
    ~
  ==
::  to JSON
::
::  notifications
::
++  test-enjs-publish-diagnostics
  %+  expect-eq
    !>  %-  notification:enjs
    [%text-document--publish-diagnostics 'file://' [diagnostic ~]]
  !>  ^-  json
  %+  make-notification-jon  'textDocument/publishDiagnostics'
  :-  %o
  %:  malt
    ['uri' `json`[%s 'file://']]
    ['diagnostics' `json`[%a [diagnostic-jon ~]]]
    ~
  ==
::  responses
++  test-enjs-hover
  %+  expect-eq
    !>   %-  response:enjs
    [%text-document--hover '1' `'text']
  !>  ^-  json
  %+  make-response-jon  '1'
  %+  frond  'contents'
  s+'text'
::
++  test-enjs-completion
  %+  expect-eq
    !>  %-  response:enjs
    [%text-document--completion '1' ~[completion-item]]
  !>  ^-  json
  %+  make-response-jon  '1'
  [%a ~[completion-item-jon]]
--