// @include org.kohsuke.stapler.codemirror.lib.codemirror
var MT = ModeTest;
MT.modeName = 'stex';
MT.modeOptions = {};

MT.testMode(
  'word',
  'foo',
  [
    null, 'foo'
  ]
);

MT.testMode(
  'twoWords',
  'foo bar',
  [
    null, 'foo bar'
  ]
);

MT.testMode(
  'beginEndDocument',
  '\\begin{document}\n\\end{document}',
  [
    'tag', '\\begin',
    'bracket', '{',
    'atom', 'document',
    'bracket', '}',
    'tag', '\\end',
    'bracket', '{',
    'atom', 'document',
    'bracket', '}'
  ]
);

MT.testMode(
  'beginEndEquation',
  '\\begin{equation}\n  E=mc^2\n\\end{equation}',
  [
    'tag', '\\begin',
    'bracket', '{',
    'atom', 'equation',
    'bracket', '}',
    null, '  E=mc^2',
    'tag', '\\end',
    'bracket', '{',
    'atom', 'equation',
    'bracket', '}'
  ]
);

MT.testMode(
  'beginModule',
  '\\begin{module}[]',
  [
    'tag', '\\begin',
    'bracket', '{',
    'atom', 'module',
    'bracket', '}[]'
  ]
);

MT.testMode(
  'beginModuleId',
  '\\begin{module}[id=bbt-size]',
  [
    'tag', '\\begin',
    'bracket', '{',
    'atom', 'module',
    'bracket', '}[',
    null, 'id=bbt-size',
    'bracket', ']'
  ]
);

MT.testMode(
  'importModule',
  '\\importmodule[b-b-t]{b-b-t}',
  [
    'tag', '\\importmodule',
    'bracket', '[',
    'string', 'b-b-t',
    'bracket', ']{',
    'builtin', 'b-b-t',
    'bracket', '}'
  ]
);

MT.testMode(
  'importModulePath',
  '\\importmodule[\\KWARCslides{dmath/en/cardinality}]{card}',
  [
    'tag', '\\importmodule',
    'bracket', '[',
    'tag', '\\KWARCslides',
    'bracket', '{',
    'string', 'dmath/en/cardinality',
    'bracket', '}]{',
    'builtin', 'card',
    'bracket', '}'
  ]
);

MT.testMode(
  'psForPDF',
  '\\PSforPDF[1]{#1}', // could treat #1 specially
  [
    'tag', '\\PSforPDF',
    'bracket', '[',
    'atom', '1',
    'bracket', ']{',
    null, '#1',
    'bracket', '}'
  ]
);

MT.testMode(
  'comment',
  '% foo',
  [
    'comment', '% foo'
  ]
);

MT.testMode(
  'tagComment',
  '\\item% bar',
  [
    'tag', '\\item',
    'comment', '% bar'
  ]
);

MT.testMode(
  'commentTag',
  ' % \\item',
  [
    null, ' ',
    'comment', '% \\item'
  ]
);

MT.testMode(
  'commentLineBreak',
  '%\nfoo',
  [
    'comment', '%',
    null, 'foo'
  ]
);

MT.testMode(
  'tagErrorCurly',
  '\\begin}{',
  [
    'tag', '\\begin',
    'error', '}',
    'bracket', '{'
  ]
);

MT.testMode(
  'tagErrorSquare',
  '\\item]{',
  [
    'tag', '\\item',
    'error', ']',
    'bracket', '{'
  ]
);

MT.testMode(
  'commentCurly',
  '% }',
  [
    'comment', '% }'
  ]
);

MT.testMode(
  'tagHash',
  'the \\# key',
  [
    null, 'the ',
    'tag', '\\#',
    null, ' key'
  ]
);

MT.testMode(
  'tagNumber',
  'a \\$5 stetson',
  [
    null, 'a ',
    'tag', '\\$',
  'atom', 5,
  null, ' stetson'
  ]
);

MT.testMode(
  'tagPercent',
  '100\\% beef',
  [
    'atom', '100',
    'tag', '\\%',
    null, ' beef'
  ]
);

MT.testMode(
  'tagAmpersand',
  'L \\& N',
  [
    null, 'L ',
    'tag', '\\&',
    null, ' N'
  ]
);

MT.testMode(
  'tagUnderscore',
  'foo\\_bar',
  [
    null, 'foo',
    'tag', '\\_',
    null, 'bar'
  ]
);

MT.testMode(
  'tagBracketOpen',
  '\\emph{\\{}',
  [
    'tag', '\\emph',
    'bracket', '{',
    'tag', '\\{',
    'bracket', '}'
  ]
);

MT.testMode(
  'tagBracketClose',
  '\\emph{\\}}',
  [
    'tag', '\\emph',
    'bracket', '{',
    'tag', '\\}',
    'bracket', '}'
  ]
);

MT.testMode(
  'tagLetterNumber',
  'section \\S1',
  [
    null, 'section ',
    'tag', '\\S',
    'atom', '1'
  ]
);

MT.testMode(
  'textTagNumber',
  'para \\P2',
  [
    null, 'para ',
    'tag', '\\P',
    'atom', '2'
  ]
);

MT.testMode(
  'thinspace',
  'x\\,y', // thinspace
  [
    null, 'x',
    'tag', '\\,',
    null, 'y'
  ]
);

MT.testMode(
  'thickspace',
  'x\\;y', // thickspace
  [
    null, 'x',
    'tag', '\\;',
    null, 'y'
  ]
);

MT.testMode(
  'negativeThinspace',
  'x\\!y', // negative thinspace
  [
    null, 'x',
    'tag', '\\!',
    null, 'y'
  ]
);

MT.testMode(
  'periodNotSentence',
  'J.\\ L.\\ is', // period not ending a sentence
  [
    null, 'J.\\ L.\\ is'
  ]
); // maybe could be better

MT.testMode(
  'periodSentence',
  'X\\@. The', // period ending a sentence
  [
    null, 'X',
    'tag', '\\@',
    null, '. The'
  ]
);

MT.testMode(
  'italicCorrection',
  '{\\em If\\/} I', // italic correction
  [
    'bracket', '{',
    'tag', '\\em',
    null, ' If',
    'tag', '\\/',
    'bracket', '}',
    null, ' I'
  ]
);

MT.testMode(
  'tagBracket',
  '\\newcommand{\\pop}',
  [
    'tag', '\\newcommand',
    'bracket', '{',
    'tag', '\\pop',
    'bracket', '}'
  ]
);