| 1 | #!/usr/bin/env python2
 | 
| 2 | # Copyright 2016 Andy Chu. All rights reserved.
 | 
| 3 | # Licensed under the Apache License, Version 2.0 (the "License");
 | 
| 4 | # you may not use this file except in compliance with the License.
 | 
| 5 | # You may obtain a copy of the License at
 | 
| 6 | #
 | 
| 7 | #   http://www.apache.org/licenses/LICENSE-2.0
 | 
| 8 | """
 | 
| 9 | id_kind_test.py: Tests for id_kind_def.py
 | 
| 10 | """
 | 
| 11 | from __future__ import print_function
 | 
| 12 | 
 | 
| 13 | import unittest
 | 
| 14 | 
 | 
| 15 | from _devbuild.gen.id_kind_asdl import Id, Kind
 | 
| 16 | from frontend import consts
 | 
| 17 | from frontend.lexer import DummyToken as Tok
 | 
| 18 | from frontend.lexer_def import ID_SPEC
 | 
| 19 | 
 | 
| 20 | _kind_sizes = ID_SPEC.kind_sizes
 | 
| 21 | 
 | 
| 22 | 
 | 
| 23 | class TokensTest(unittest.TestCase):
 | 
| 24 | 
 | 
| 25 |     def testId(self):
 | 
| 26 |         #print(dir(Id))
 | 
| 27 |         print(Id.Op_Newline)
 | 
| 28 |         print(Id.Undefined_Tok)
 | 
| 29 | 
 | 
| 30 |     def testTokens(self):
 | 
| 31 |         print(Id.Op_Newline)
 | 
| 32 |         print(Tok(Id.Op_Newline, '\n'))
 | 
| 33 | 
 | 
| 34 |         print(Id.Op_Newline)
 | 
| 35 | 
 | 
| 36 |         print(Kind.Eof)
 | 
| 37 |         print(Kind.Left)
 | 
| 38 | 
 | 
| 39 |         print('--')
 | 
| 40 |         num_kinds = 0
 | 
| 41 |         for name in dir(Kind):
 | 
| 42 |             if name[0].isupper():
 | 
| 43 |                 kind = getattr(Kind, name)
 | 
| 44 |                 print('%-20s %s' % (name, kind))
 | 
| 45 |                 num_kinds += 1
 | 
| 46 | 
 | 
| 47 |         print()
 | 
| 48 |         print('Number of Kinds:', num_kinds)
 | 
| 49 |         print()
 | 
| 50 | 
 | 
| 51 |         for name in dir(Id):
 | 
| 52 |             if name[0].isupper():
 | 
| 53 |                 id_ = getattr(Id, name)
 | 
| 54 |                 print('%-30s %s' % (name, id_))
 | 
| 55 | 
 | 
| 56 |         # 309 out of 256 tokens now
 | 
| 57 |         print()
 | 
| 58 |         print('Number of IDs:', len(ID_SPEC.id_str2int))
 | 
| 59 | 
 | 
| 60 |         t = Tok(Id.Arith_Plus, '+')
 | 
| 61 |         self.assertEqual(Kind.Arith, consts.GetKind(t.id))
 | 
| 62 |         t = Tok(Id.Arith_CaretEqual, '^=')
 | 
| 63 |         self.assertEqual(Kind.Arith, consts.GetKind(t.id))
 | 
| 64 |         t = Tok(Id.Arith_RBrace, '}')
 | 
| 65 |         self.assertEqual(Kind.Arith, consts.GetKind(t.id))
 | 
| 66 | 
 | 
| 67 |         t = Tok(Id.BoolBinary_GlobDEqual, '==')
 | 
| 68 |         self.assertEqual(Kind.BoolBinary, consts.GetKind(t.id))
 | 
| 69 | 
 | 
| 70 |         t = Tok(Id.BoolBinary_Equal, '=')
 | 
| 71 |         self.assertEqual(Kind.BoolBinary, consts.GetKind(t.id))
 | 
| 72 | 
 | 
| 73 |     def testLexerPairs(self):
 | 
| 74 | 
 | 
| 75 |         def MakeLookup(p):
 | 
| 76 |             return dict((pat, tok) for _, pat, tok in p)
 | 
| 77 | 
 | 
| 78 |         lookup = MakeLookup(ID_SPEC.LexerPairs(Kind.BoolUnary))
 | 
| 79 |         #print(lookup)
 | 
| 80 |         self.assertEqual(Id.BoolUnary_e, lookup['-e'])
 | 
| 81 |         self.assertEqual(Id.BoolUnary_z, lookup['-z'])
 | 
| 82 | 
 | 
| 83 |         lookup2 = MakeLookup(ID_SPEC.LexerPairs(Kind.BoolBinary))
 | 
| 84 |         self.assertEqual(Id.BoolBinary_eq, lookup2['-eq'])
 | 
| 85 |         #print(lookup2)
 | 
| 86 | 
 | 
| 87 |     def testPrintStats(self):
 | 
| 88 |         print('---')
 | 
| 89 |         k = _kind_sizes
 | 
| 90 |         print('STATS: %d tokens in %d groups: %s' % (sum(k), len(k), k))
 | 
| 91 |         # Thinking about switching
 | 
| 92 |         big = [i for i in k if i > 8]
 | 
| 93 |         print('%d BIG groups: %s' % (len(big), sorted(big)))
 | 
| 94 | 
 | 
| 95 | 
 | 
| 96 | if __name__ == '__main__':
 | 
| 97 |     unittest.main()
 |