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()