77
88from uctypes import UINT32 , BFUINT32 , BF_POS , BF_LEN
99from esp32_ulp .opcodes_s2 import make_ins , make_ins_struct_def
10- from esp32_ulp .opcodes_s2 import get_reg , get_imm , get_cond , arg_qualify , eval_arg , ARG , REG , IMM , SYM , COND
10+ from esp32_ulp .opcodes_s2 import get_reg , get_imm , get_cond , arg_qualify , parse_int , eval_arg , ARG , REG , IMM , SYM , COND
1111from esp32_ulp .assemble import SymbolTable , ABS , REL , TEXT
1212import esp32_ulp .opcodes_s2 as opcodes
1313
@@ -39,13 +39,37 @@ def test_make_ins():
3939 assert _delay .all == 0x40000023
4040
4141
42+ def test_parse_int ():
43+ # decimal
44+ assert parse_int ("5" ) == 5 , "5 == 5"
45+ assert parse_int ("-5" ) == - 5 , "-5 == -5"
46+ # hex
47+ assert parse_int ("0x5" ) == 5 , "0x5 == 5"
48+ assert parse_int ("0x5a" ) == 90 , "0x5a == 90"
49+ assert parse_int ("-0x5a" ) == - 90 , "-0x5a == -90"
50+ # binary
51+ assert parse_int ("0b1001" ) == 9 , "0b1001 == 9"
52+ assert parse_int ("-0b1001" ) == - 9 , "-0b1001 == 9"
53+ # octal
54+ assert parse_int ("0100" ) == 64 , "0100 == 64"
55+ assert parse_int ("0o210" ) == 136 , "0o210 == 136"
56+ assert parse_int ("-0100" ) == - 64 , "-0100 == -64"
57+ assert parse_int ("-0o210" ) == - 136 , "-0o210 == -136"
58+ # negative cases
59+ assert_raises (ValueError , parse_int , '0b123' , message = "invalid syntax for integer with base 2: '123'" )
60+ assert_raises (ValueError , parse_int , '0900' , message = "invalid syntax for integer with base 8: '0900'" )
61+ assert_raises (ValueError , parse_int , '0o900' , message = "invalid syntax for integer with base 8: '900'" )
62+ assert_raises (ValueError , parse_int , '0xg' , message = "invalid syntax for integer with base 16: 'g'" )
63+
64+
4265def test_arg_qualify ():
4366 assert arg_qualify ('r0' ) == ARG (REG , 0 , 'r0' )
4467 assert arg_qualify ('R3' ) == ARG (REG , 3 , 'R3' )
4568 assert arg_qualify ('0' ) == ARG (IMM , 0 , '0' )
4669 assert arg_qualify ('-1' ) == ARG (IMM , - 1 , '-1' )
4770 assert arg_qualify ('1' ) == ARG (IMM , 1 , '1' )
4871 assert arg_qualify ('0x20' ) == ARG (IMM , 32 , '0x20' )
72+ assert arg_qualify ('0100' ) == ARG (IMM , 64 , '0100' )
4973 assert arg_qualify ('0o100' ) == ARG (IMM , 64 , '0o100' )
5074 assert arg_qualify ('0b1000' ) == ARG (IMM , 8 , '0b1000' )
5175 assert arg_qualify ('eq' ) == ARG (COND , 'eq' , 'eq' )
@@ -96,6 +120,11 @@ def test_eval_arg():
96120 assert eval_arg ('const >> 1' ) == 21
97121 assert eval_arg ('(const|4)&0xf' ) == 0xe
98122
123+ assert eval_arg ('0x7' ) == 7
124+ assert eval_arg ('010' ) == 8
125+ assert eval_arg ('-0x7' ) == - 7 # negative
126+ assert eval_arg ('~0x7' ) == - 8 # complement
127+
99128 assert_raises (ValueError , eval_arg , 'evil()' )
100129 assert_raises (ValueError , eval_arg , 'def cafe()' )
101130 assert_raises (ValueError , eval_arg , '1 ^ 2' )
@@ -105,14 +134,17 @@ def test_eval_arg():
105134 opcodes .symbols = None
106135
107136
108- def assert_raises (exception , func , * args ):
137+ def assert_raises (exception , func , * args , message = None ):
109138 try :
110139 func (* args )
111- except exception :
140+ except exception as e :
112141 raised = True
142+ actual_message = e .args [0 ]
113143 else :
114144 raised = False
115145 assert raised
146+ if message :
147+ assert actual_message == message , '%s == %s' % (actual_message , message )
116148
117149
118150def test_reg_direct_ulp_addressing ():
@@ -258,6 +290,7 @@ def test_reg_address_translations_s3_sens():
258290
259291test_make_ins_struct_def ()
260292test_make_ins ()
293+ test_parse_int ()
261294test_arg_qualify ()
262295test_get_reg ()
263296test_get_imm ()
0 commit comments