import json
import unittest

_testCase = [
	("var",{'var':0},True),

	("var is string",{'var':""},True),
        ("var is string",{'var':5},False),
        ("var is string",{'var':True},False),
        ("var is string",{'var':[]},False),
        ("var is string",{'var':{}},False),
        ("var is not string",{'var':""},False),
        ("var is not string",{'var':5},True),
        ("var is not string",{'var':True},True),
        ("var is not string",{'var':[]},True),
        ("var is not string",{'var':{}},True),

	("var is number",{'var':5},True),
        ("var is number",{'var':""},False),
        ("var is number",{'var':True},False),
        ("var is number",{'var':[]},False),
        ("var is number",{'var':{}},False),
        ("var is number",{'var':5.5},True),
        ("var is number",{'var':0.5},True),
        ("var is not number",{'var':5},False),
        ("var is not number",{'var':5.5},False),
        ("var is not number",{'var':0.5},False),
        ("var is not number",{'var':""},True),
        ("var is not number",{'var':True},True),
        ("var is not number",{'var':[]},True),
        ("var is not number",{'var':{}},True),

        ("var is bool",{'var':True},True),
        ("var is bool",{'var':False},True),
        ("var is bool",{'var':5},False),
        ("var is bool",{'var':0.5},False),
        ("var is bool",{'var':5.5},False),
        ("var is bool",{'var':""},False),
        ("var is bool",{'var':[]},False),
        ("var is bool",{'var':{}},False),
        ("var not is bool",{'var':True},False),
        ("var not is bool",{'var':False},False),
        ("var is not bool",{'var':5},True),
        ("var is not bool",{'var':0.5},True),
        ("var is not bool",{'var':5.5},True),
        ("var is not bool",{'var':""},True),
        ("var is not bool",{'var':[]},True),
        ("var is not bool",{'var':{}},True),

        ("var is list",{'var':[]},True),
        ("var is not list",{'var':[]},False),

        ("var is not dict",{'var':{}},False),
        ("var is dict",{'var':{}},True),

	("var == 'text'",{'var':"text"},True),
        ("var == 'text'",{'var':"not text"},False),
        ("var == 'text'",{'var':5},False),
        ("var == 'text'",{'var':True},False),
        ("var == 'text'",{'var':[]},False),
        ("var == 'text'",{'var':{}},False),
	("var == 5",{'var':5},True),
        ("var == false",{'var':True},True),
        ("var == []",{'var':[]},True),
        ("var == {}",{'var':{}},True),
        ("var == 5",{'var':"5"},False),
        ("var == true",{'var':"true"},False),

	("true",{},True),
	("false",{},False)
]

class TestPredicateParse(unittest.TestCase):
	def test_all(self):
		for expr,ctx,expect in _testCase:
			result = predicateParse(expr,ctx)
			self.assertEqual(expect,result,expr)

varnameFsm = {
	'begin' : {
		'next' : [
			(r'[a-z][a-zA-Z0-9_]*','name')
		]
	},
	'name' : {
		'next' : [
			(r'\[[0-9]+\]','index'),
			(r'\.','dot')
		],
		'default' : 'end',
		'predicate' : [
			lambda varname : lambda ctx : varname in ctx
		],
		'getter' : [
			lambda varname : lambda ctx : ctx[varname]
		]
	},
	'dot' : {
		'next' : [
			(r'[a-z][a-zA-Z0-9_]*','name')
		]
	},
	'index' : {
		'next' : [
			(r'\.','dot')
		],
		'default' : 'end',
		'predicate' : [
			lambda index : lambda ctx : len(ctx) > index
		],
		'getter' : [
			lambda index : lambda ctx : ctx[index]
		]
	},
	'end' : {}
}

class Fsm(object):
	pass

class Begin(Fsm):
	def __init__(self,expr):
		self.expr = expr

	def get(self,ctx):
		pass

class Varname(Fsm):
	def get(self,ctx):
		pass

class Index(Fsm):
	def get(self,ctx):
		pass

class Dot(Fsm):
	def get(self,ctx):
		pass

def predicateParse(expression,context):
	'''
	'''
	assert isinstance(expression,str)
	assert isinstance(context,dict)

	op = []
	getter = lambda ctx : ctx
	predicateLst = []

	state = 'begin'
	while state != 'end':
		if 'predicate' in varnameFsm[state]:
			predicateLst += varnameFsm[state]['predicate']
		if 'getter' in varnameFsm[state]:
			getter = lambda ctx : 	
	
	return


if __name__ == '__main__':
	unittest.main()
