tricu

A lazy functional language based on Tree Calculus
Log | Files | Refs | README | LICENSE

binding_substitution_test.py (2100B)


      1 #!/usr/bin/env python3
      2 """Intent controls for the named-variable substitution and rewrite oracle."""
      3 import unittest
      4 from binding_substitution import C,substitution,shifted,rewrite,transform,encode
      5 from http_headers import LEAF,TRUE
      6 from base_workloads import encode as nat
      7 
      8 
      9 class SubstitutionTests(unittest.TestCase):
     10     selector=nat(98765)
     11     negation=nat(98766)
     12 
     13     def test_capture_avoidance_and_span_origins(self):
     14         rhs=C(2,0,70,80)
     15         body=C(4,C(3,(C(2,1,20,21),C(2,0,22,23)),18,24),10,30)
     16         wanted=C(4,C(3,(C(2,1,70,80),C(2,0,22,23)),18,24),10,30)
     17         self.assertEqual(substitution(body,rhs),wanted)
     18 
     19     def test_outer_indices_decrease(self):
     20         self.assertEqual(substitution(C(2,5,20,30),C(1)),C(2,4,20,30))
     21 
     22     def test_rhs_local_binding_not_shifted(self):
     23         rhs=C(4,C(2,0,7,8),6,9)
     24         self.assertEqual(substitution(C(4,C(2,1),10,20),rhs),C(4,rhs,10,20))
     25 
     26     def test_shift_cutoff_and_zero(self):
     27         node=C(3,(C(2,0,1,2),C(2,2,3,4)),0,5)
     28         self.assertEqual(shifted(node,3,1),C(3,(C(2,0,1,2),C(2,5,3,4)),0,5))
     29         self.assertEqual(shifted(node,0,1),node)
     30 
     31     def test_binding_outer_span_preserved(self):
     32         rhs=C(5,TRUE,7,8)
     33         binding=C(3,(C(4,C(2,0,20,21),10,30),rhs),1,40)
     34         code,out=rewrite(binding,self.selector,self.negation)
     35         self.assertEqual(code,1)
     36         self.assertEqual(out,C(5,TRUE,1,40))
     37 
     38     def test_uncertified_rhs_and_unrelated_lambda_rejected_exactly(self):
     39         bodies=[(C(2,0),C(4,C(2,0)),7),
     40                 (C(8,(C(2,0),C(4,C(2,0)))),C(5,TRUE),8)]
     41         for body,rhs,expected in bodies:
     42             node=C(3,(C(4,body),rhs),10,20)
     43             code,out=rewrite(node,self.selector,self.negation)
     44             self.assertEqual(code,expected)
     45             self.assertEqual(encode(out),encode(node))
     46 
     47     def test_rejected_parent_does_not_rewrite_children(self):
     48         child=C(3,(C(4,C(2,0)),C(5,TRUE)))
     49         parent=C(3,(C(4,C(8,(C(2,0),child))),C(4,C(2,0))))
     50         self.assertEqual(transform(parent,self.selector,self.negation),parent)
     51 
     52 
     53 if __name__=='__main__':unittest.main()