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