Package lepl :: Package lexer :: Package lines :: Package _test :: Module errors
[hide private]
[frames] | no frames]

Source Code for Module lepl.lexer.lines._test.errors

 1   
 2  # The contents of this file are subject to the Mozilla Public License 
 3  # (MPL) Version 1.1 (the "License"); you may not use this file except 
 4  # in compliance with the License. You may obtain a copy of the License 
 5  # at http://www.mozilla.org/MPL/ 
 6  # 
 7  # Software distributed under the License is distributed on an "AS IS" 
 8  # basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See 
 9  # the License for the specific language governing rights and 
10  # limitations under the License. 
11  # 
12  # The Original Code is LEPL (http://www.acooke.org/lepl) 
13  # The Initial Developer of the Original Code is Andrew Cooke. 
14  # Portions created by the Initial Developer are Copyright (C) 2009-2010 
15  # Andrew Cooke (andrew@acooke.org). All Rights Reserved. 
16  # 
17  # Alternatively, the contents of this file may be used under the terms 
18  # of the LGPL license (the GNU Lesser General Public License, 
19  # http://www.gnu.org/licenses/lgpl.html), in which case the provisions 
20  # of the LGPL License are applicable instead of those above. 
21  # 
22  # If you wish to allow use of your version of this file only under the 
23  # terms of the LGPL License and not to allow others to use your version 
24  # of this file under the MPL, indicate your decision by deleting the 
25  # provisions above and replace them with the notice and other provisions 
26  # required by the LGPL License.  If you do not delete the provisions 
27  # above, a recipient may use your version of this file under either the 
28  # MPL or the LGPL License. 
29   
30  ''' 
31  A test related to error handling, based on a bug report. 
32  ''' 
33   
34  from logging import basicConfig, DEBUG 
35  from sys import exc_info 
36  from unittest import TestCase 
37   
38  from lepl import * 
39   
40   
41 -class ErrorTest(TestCase):
42
43 - def make_parser(self):
44 45 with TraceVariables(False): 46 introduce = ~Token(':') 47 hash = Token('#.*') 48 49 InvalidName = Token('[0-9_][a-zA-Z0-9_]*') 50 name = Or(Token('[a-zA-Z][a-zA-Z0-9_]*'), 51 InvalidName ** make_error( 'InvalidName' )) 52 53 typename = Or(Token(Literal('int')), 54 Token(Literal('bool'))) 55 56 memberdef = Line(typename & name) > tuple 57 58 block = Delayed() 59 60 line = (Line(name) | block) 61 62 BlockStart = Or(Line(name & introduce), 63 Line(name) ** make_error('BlockStart-OnlyName'), 64 Line(introduce) ** make_error('BlockStart-OnlyColon')) 65 block += BlockStart & (Block(memberdef) > list) 66 67 program = (line[:] & Eos()) >> sexpr_throw 68 program.config.lines(block_policy=explicit) 69 70 return program.get_parse_string()
71
72 - def test_valid(self):
73 ''' 74 There was a bug here with sexpr_throw, which didn't iterate correctly 75 over generators. 76 ''' 77 #basicConfig(level=DEBUG) 78 p = self.make_parser() 79 #print(p.matcher.tree()) 80 result = p('foo:\n int i' ) 81 assert result == ['foo', [('int', 'i')]], result
82
83 - def test_error(self):
84 p = self.make_parser() 85 try: 86 result = p('foo\n int i') 87 assert False, 'no error' 88 except Error: 89 error = exc_info()[1] 90 assert str(error) == "BlockStart-OnlyName (<string>, line 1)", str(error)
91