class TestParseCase(unittest.TestCase):
  '''testing with RPNEmitter'''

  def setUp(self):
    self.parser = REParser(RPNStringEmitter())
    
  def test_Empty(self):
    self.assertEqual(self.parser.parse(''), '')

  def test_a(self):
    self.assertEqual(self.parser.parse('a'), 'a')
  
  def test_b(self):
    self.assertEqual(self.parser.parse('b'), 'b')

  def test_a_multi(self):
    self.assertEqual(self.parser.parse('a*'), 'a*')

  def test_cat_ab(self):
    self.assertEqual(self.parser.parse('ab'), 'ab+')

  def test_cat_abc(self):
    self.assertEqual(self.parser.parse('abc'), 'ab+c+')

  def test_LP_ab_RP_c(self):
    self.assertEqual(self.parser.parse('(ab)c'), 'ab+c+')

  def test_LP_a_RP(self):
    self.assertEqual(self.parser.parse('(a)'), 'a')

  def test_LPLP_a_RPRP(self):
    self.assertEqual(self.parser.parse('((a))'), 'a')

  def test_a_cat_a_or_b(self):
    self.assertEqual(self.parser.parse('aa|b'), 'aa+b|')

  def test_LP_aa_RP_or_b(self):
    self.assertEqual(self.parser.parse('(aa)|b'), 'aa+b|')

  def test_a_LP_a_or_b_RP(self):
    self.assertEqual(self.parser.parse('a(a|b)'), 'aab|+')

  def test_amutli_or_b(self):
    self.assertEqual(self.parser.parse('a*|b'), 'a*b|')

  def test_escapse(self):
    self.assertEqual(self.parser.parse('\|'), '\|')

  def test_escapse2(self):
    self.assertEqual(self.parser.parse('\|a'), '\|a+')

  def test_a_or_bmutli(self):
    self.assertEqual(self.parser.parse('a|b*'), 'ab*|')

  def test_LP_a_or_b_RP_mutli(self):
    self.assertEqual(self.parser.parse('(a|b)*'), 'ab|*')


  def test_a_or_b_or_c(self):
    self.assertEqual(self.parser.parse('a|b|c'), 'ab|c|')

  def test_LP_a_m_RP_m(self):
    self.assertEqual(self.parser.parse('(a*)*'), 'a**')

  def xtest_a_mm(self):
    '''
      >>> import re
      >>> r = re.compile('a**')
      
      would fail.

    '''
    self.assertEqual(self.parser.parse('a**'), 'a**')

  def test_LP_a_RP_b(self):
    self.assertEqual(self.parser.parse('(a)b'), 'ab+')

  def test_LP_a_m_RP_b(self):
    self.assertEqual(self.parser.parse('(a)*b'), 'a*b+')

  def test_LP_a_m_RP_b_b(self):
    self.assertEqual(self.parser.parse('(a)*bb'), 'a*b+b+')

  def test_LP_LP_a_m_RP_b_RP_b(self):
    self.assertEqual(self.parser.parse('((a)*b)b'), 'a*b+b+')

  def test_aa_LP_a_or_b_RP(self):
    self.assertEqual(self.parser.parse('(aa)(a|b)'), 'aa+ab|+')

  def test_aa_LP_a_or_b_RP(self):
    self.assertEqual(self.parser.parse('aa(a|b)'), 'aa+ab|+')
 def setUp(self):
   self.parser = REParser(RPNStringEmitter())
class TestThompson(unittest.TestCase):
  def setUp(self):
    self.parser = REParser(Thompson())

  def test_Empty(self):
    nfa = self.parser.parse('')
    self.assert_(set(nfa.states[nfa.initial]['']) &set(nfa.finals))

  def test_a(self):
    nfa = self.parser.parse('a')
    self.assert_(set(nfa.states[nfa.initial]['a']) & set(nfa.finals))
    
  def test_a_cat_b(self):
    nfa = self.parser.parse('ab')
    before_b = nfa.states[nfa.initial]['a']
    self.assert_(before_b)
    self.assertEqual(len(before_b), 1)
    b = before_b[0]
    print nfa.finals
    self.assert_(set(nfa.states[b]['b']) & set(nfa.finals))
  
  def test_a_or_b(self):
    nfa = self.parser.parse('a|b')
    for s in  nfa.states[nfa.initial]['']:
      if 'a' in nfa.states[s]:
        an = nfa.states[s]['a']

      if 'b' in nfa.states[s]:
        bn = nfa.states[s]['b']

    ax = set()
    print nfa.states
    for x in an:
      print nfa.states[x]
      ax |= set(nfa.states[x][''])

    bx = set()
    for x in bn:
      bx |= set(nfa.states[x][''])

    self.assert_(set(ax) & set(nfa.finals))
    self.assert_(set(bx) & set(nfa.finals))

  def test_a_zom(self):
    nfa = self.parser.parse('a*')

    self.assert_(set(nfa.states[nfa.initial]['']) & set(nfa.finals))

    for s in nfa.states[nfa.initial]['']:
      if s not in nfa.finals:
        break
    Nsi = s

    xs = nfa.states[Nsi]['a']
    self.assertEqual(len(xs), 1)
    Nsf = xs[0]
      
    for s in nfa.states[Nsf]['']:
      self.assert_(s in nfa.finals or Nsi == s)
    
      
  def test_LP_a_or_b_RP_c(self):
    nfa = self.parser.parse('(a|b)c')
    print 'b -> '
    self.assertFalse(nfa.feed('b'))
    print 'bc -> '
    self.assert_(nfa.feed('bc'))

  def test_LP_a_or_b_RP_c_2(self):
    nfa = self.parser.parse('(a|b)c')
    print 'a -> '
    self.assertFalse(nfa.feed('a'))
    print 'ac -> '
    self.assert_(nfa.feed('ac'))
 def setUp(self):
   self.parser = REParser(Thompson())
    b = self.pop()
    a = self.pop()
    ab = NFA.build_cat(a, b)
    self.push(ab)

  def ZOM(self, Ns):
    a = self.pop()
    azom = NFA.build_zom(a)
    self.push(azom)


  def LP(self, t):
    pass

  def RP(self, t):
    pass



if __name__ == "__main__":
  from reparser import REParser
  parser = REParser(Thompson())
  nfa = parser.parse('(a|b)*abb')
  print nfa.states
  print 'abb ==>', nfa.feed('abb')
  print '--'
  print 'babb ==>', nfa.feed('babb')
  print '--'
  print 'bbabb ==>', nfa.feed('bbabb')