-------------------------------------------------------------------------------
-- Copyright (c) 2006-2013 David Manura and others.
--
-- All rights reserved.
--
-- This program and the accompanying materials are made available
-- under the terms of the Eclipse Public License v1.0 which
-- accompanies this distribution, and is available at
-- http://www.eclipse.org/legal/epl-v10.html
--
-- This program and the accompanying materials are also made available
-- under the terms of the MIT public license which accompanies this
-- distribution, and is available at http://www.lua.org/license.html
--
-- Contributors:
--     David Manura - API and implementation
--
-------------------------------------------------------------------------------

-- tests of lexer (preliminary)
--
-- D.Manura.  Copyright (c) 2011, Fabien Fleutot <metalua@gmail.com>.
--
-- This software is released under the MIT Licence, see Metalua licence.txt
-- for details.


package.path = 'src/compiler/?.lua;src/lib/?.lua'

require 'mlp_lexer'
local LX = mlp.lexer

-- equality check.
local function checkeq(a, b)
  if a ~= b then
    error('not equal:\n' .. tostring(a) .. '\n' .. tostring(b), 2)
  end
end

local function checkmatch(a, b)
  if not a:match(b) then
    error('not match:\n' .. tostring(a) .. '\n' .. tostring(b), 2)
  end
end

-- reads file to string (with limited error handling)
local function readfile(filename)
  local fh = assert(io.open(filename, 'rb'))
  local text = fh:read'*a'
  fh:close()
  return text
end

-- formats token succinctly.
local function tokfmt(tok)
  local function fmt(o)
    return (type(o) == 'string') and ("%q"):format(o):sub(2,-2) or tostring(o)
  end
  return [[`]] .. tok.tag .. tostring(tok.lineinfo):gsub('%|L[^%|]*%|C[^%|]*', '') .. '{' .. fmt(tok[1]) .. '}'
end

-- utility function to lex code
local function lex(code)
  local sm = LX:newstream(code)
  local toks = {}
  while 1 do
    local tok = sm:next()
    toks[#toks+1] = tokfmt(tok)
    if tok.tag == 'Eof' then
      break
    end
  end
  return table.concat(toks)
end
local function tlex(code)
  local sm = LX:newstream(code)
  local toks = {}
  while 1 do
    local tok = sm:next()
    toks[#toks+1] = tok
    if tok.tag == 'Eof' then break end
  end
return toks
end
local function plex(code)
  return pcall(lex, code)
end

--FIX checkeq(nil, plex '====')

-- trivial tests
checkeq(lex[[]], [[`Eof<?|K1>{eof}]])
checkeq(lex'\t', [[`Eof<?|K2>{eof}]])
checkeq(lex'\n', [[`Eof<?|K2>{eof}]])
checkeq(lex'--', [[`Eof<C|?|K3>{eof}]])
checkeq(lex'\n -- \n--\n ', [[`Eof<C|?|K11>{eof}]])
checkeq(lex[[return]], [[`Keyword<?|K1-6>{return}`Eof<?|K7>{eof}]])

-- string tests
checkeq(lex[["\092b"]],  [[`String<?|K1-7>{\\b}`Eof<?|K8>{eof}]]) -- was bug
checkeq(lex[["\x5Cb"]],  [[`String<?|K1-7>{\\b}`Eof<?|K8>{eof}]]) -- [5.2]
checkeq(lex[["\0\t\090\100\\\1004"]],  [[`String<?|K1-21>{\000	Zd\\d4}`Eof<?|K22>{eof}]]) -- decimal/escape

-- number tests, hex (including Lua 5.2)
local t = tlex[[0xa 0xB 0xfF -0xFf 0x1.8 0x1.8P1 0x1.8p+01 0x.8p-1]]
checkeq(t[1][1], 0xa)
checkeq(t[2][1], 0xB)
checkeq(t[3][1], 0xfF)
checkeq(t[4][1], '-')
checkeq(t[5][1], 0xFf)
-- 5.2 hex floats
checkeq(t[6][1], 1.5) -- 0x1.8
checkeq(t[7][1], 3) -- 0x1.8P1
checkeq(t[8][1], 3) -- 0x1.8p+01
checkeq(t[9][1], 0.25) -- 0x0.8p-1
checkeq(t[10][1], 'eof')


-- Lua 5.2
checkeq(lex'"a\\z \n ."', [[`String<?|K1-9>{a.}`Eof<?|K10>{eof}]])  -- \z
checkeq(lex'"\\z"', [[`String<?|K1-4>{}`Eof<?|K5>{eof}]])  -- \z
checkeq(lex[["\x00\\\xfF\\xAB"]], [[`String<?|K1-17>{\000\\]]..'\255'..[[\\xAB}`Eof<?|K18>{eof}]])

-- Lua 5.2 goto and ::
checkeq(lex'goto a1 ::a1 ::', [[`Keyword<?|K1-4>{goto}`Id<?|K6-7>{a1}]]..
   [[`Keyword<?|K9-10>{::}`Id<?|K11-12>{a1}`Keyword<?|K14-15>{::}`Eof<?|K16>{eof}]])


assert(lex(readfile(arg[0]))) -- lex self

-- checks of unescape_string
local p = function(s) local ok, o = pcall(tlex, s); return ok and o[1][1] or o end
checkmatch(p[['\']], 'Unterminated')
checkeq(p[['\\a\\\t']], [[\a\]]..'\t')
checkeq(p[['\\116']], [[\116]])
checkeq(p[['\\\116']], [[\t]])
checkeq(p[['\092\116']], [[\t]]) -- was bug
checkeq(p[['\x5c\x74']], [[\t]]) -- 5.2 hex
-- Lua 5.2
checkeq(p[['\z\z \
a\z  ']], [[

a]])
checkeq(p[['\\z']], [[\z]])  -- was bug
checkmatch(p[['\xaz']], 'Unknown escape')
checkmatch(p[['\999']], 'must be in.*255')
checkeq(p[['\z\32']], ' ') -- was bug

print 'DONE'
