@@ -996,8 +996,149 @@ def __prepare__(mcls, name, bases):
996996 X = types .new_class ("X" , (int (), C ))
997997
998998
999+ class SimpleNamespaceTests (unittest .TestCase ):
1000+
1001+ def test_constructor (self ):
1002+ ns1 = types .SimpleNamespace ()
1003+ ns2 = types .SimpleNamespace (x = 1 , y = 2 )
1004+ ns3 = types .SimpleNamespace (** dict (x = 1 , y = 2 ))
1005+
1006+ with self .assertRaises (TypeError ):
1007+ types .SimpleNamespace (1 , 2 , 3 )
1008+
1009+ self .assertEqual (len (ns1 .__dict__ ), 0 )
1010+ self .assertEqual (vars (ns1 ), {})
1011+ self .assertEqual (len (ns2 .__dict__ ), 2 )
1012+ self .assertEqual (vars (ns2 ), {'y' : 2 , 'x' : 1 })
1013+ self .assertEqual (len (ns3 .__dict__ ), 2 )
1014+ self .assertEqual (vars (ns3 ), {'y' : 2 , 'x' : 1 })
1015+
1016+ def test_unbound (self ):
1017+ ns1 = vars (types .SimpleNamespace ())
1018+ ns2 = vars (types .SimpleNamespace (x = 1 , y = 2 ))
1019+
1020+ self .assertEqual (ns1 , {})
1021+ self .assertEqual (ns2 , {'y' : 2 , 'x' : 1 })
1022+
1023+ def test_underlying_dict (self ):
1024+ ns1 = types .SimpleNamespace ()
1025+ ns2 = types .SimpleNamespace (x = 1 , y = 2 )
1026+ ns3 = types .SimpleNamespace (a = True , b = False )
1027+ mapping = ns3 .__dict__
1028+ del ns3
1029+
1030+ self .assertEqual (ns1 .__dict__ , {})
1031+ self .assertEqual (ns2 .__dict__ , {'y' : 2 , 'x' : 1 })
1032+ self .assertEqual (mapping , dict (a = True , b = False ))
1033+
1034+ def test_attrget (self ):
1035+ ns = types .SimpleNamespace (x = 1 , y = 2 , w = 3 )
1036+
1037+ self .assertEqual (ns .x , 1 )
1038+ self .assertEqual (ns .y , 2 )
1039+ self .assertEqual (ns .w , 3 )
1040+ with self .assertRaises (AttributeError ):
1041+ ns .z
1042+
1043+ def test_attrset (self ):
1044+ ns1 = types .SimpleNamespace ()
1045+ ns2 = types .SimpleNamespace (x = 1 , y = 2 , w = 3 )
1046+ ns1 .a = 'spam'
1047+ ns1 .b = 'ham'
1048+ ns2 .z = 4
1049+ ns2 .theta = None
1050+
1051+ self .assertEqual (ns1 .__dict__ , dict (a = 'spam' , b = 'ham' ))
1052+ self .assertEqual (ns2 .__dict__ , dict (x = 1 , y = 2 , w = 3 , z = 4 , theta = None ))
1053+
1054+ def test_attrdel (self ):
1055+ ns1 = types .SimpleNamespace ()
1056+ ns2 = types .SimpleNamespace (x = 1 , y = 2 , w = 3 )
1057+
1058+ with self .assertRaises (AttributeError ):
1059+ del ns1 .spam
1060+ with self .assertRaises (AttributeError ):
1061+ del ns2 .spam
1062+
1063+ del ns2 .y
1064+ self .assertEqual (vars (ns2 ), dict (w = 3 , x = 1 ))
1065+ ns2 .y = 'spam'
1066+ self .assertEqual (vars (ns2 ), dict (w = 3 , x = 1 , y = 'spam' ))
1067+ del ns2 .y
1068+ self .assertEqual (vars (ns2 ), dict (w = 3 , x = 1 ))
1069+
1070+ ns1 .spam = 5
1071+ self .assertEqual (vars (ns1 ), dict (spam = 5 ))
1072+ del ns1 .spam
1073+ self .assertEqual (vars (ns1 ), {})
1074+
1075+ def test_repr (self ):
1076+ ns1 = types .SimpleNamespace (x = 1 , y = 2 , w = 3 )
1077+ ns2 = types .SimpleNamespace ()
1078+ ns2 .x = "spam"
1079+ ns2 ._y = 5
1080+
1081+ self .assertEqual (repr (ns1 ), "namespace(w=3, x=1, y=2)" )
1082+ self .assertEqual (repr (ns2 ), "namespace(_y=5, x='spam')" )
1083+
1084+ def test_nested (self ):
1085+ ns1 = types .SimpleNamespace (a = 1 , b = 2 )
1086+ ns2 = types .SimpleNamespace ()
1087+ ns3 = types .SimpleNamespace (x = ns1 )
1088+ ns2 .spam = ns1
1089+ ns2 .ham = '?'
1090+ ns2 .spam = ns3
1091+
1092+ self .assertEqual (vars (ns1 ), dict (a = 1 , b = 2 ))
1093+ self .assertEqual (vars (ns2 ), dict (spam = ns3 , ham = '?' ))
1094+ self .assertEqual (ns2 .spam , ns3 )
1095+ self .assertEqual (vars (ns3 ), dict (x = ns1 ))
1096+ self .assertEqual (ns3 .x .a , 1 )
1097+
1098+ def test_recursive (self ):
1099+ ns1 = types .SimpleNamespace (c = 'cookie' )
1100+ ns2 = types .SimpleNamespace ()
1101+ ns3 = types .SimpleNamespace (x = 1 )
1102+ ns1 .spam = ns1
1103+ ns2 .spam = ns3
1104+ ns3 .spam = ns2
1105+
1106+ self .assertEqual (ns1 .spam , ns1 )
1107+ self .assertEqual (ns1 .spam .spam , ns1 )
1108+ self .assertEqual (ns1 .spam .spam , ns1 .spam )
1109+ self .assertEqual (ns2 .spam , ns3 )
1110+ self .assertEqual (ns3 .spam , ns2 )
1111+ self .assertEqual (ns2 .spam .spam , ns2 )
1112+
1113+ def test_recursive_repr (self ):
1114+ ns1 = types .SimpleNamespace (c = 'cookie' )
1115+ ns2 = types .SimpleNamespace ()
1116+ ns3 = types .SimpleNamespace (x = 1 )
1117+ ns1 .spam = ns1
1118+ ns2 .spam = ns3
1119+ ns3 .spam = ns2
1120+
1121+ self .assertEqual (repr (ns1 ),
1122+ "namespace(c='cookie', spam=namespace(...))" )
1123+ self .assertEqual (repr (ns2 ),
1124+ "namespace(spam=namespace(spam=namespace(...), x=1))" )
1125+
1126+ def test_as_dict (self ):
1127+ ns = types .SimpleNamespace (spam = 'spamspamspam' )
1128+
1129+ with self .assertRaises (TypeError ):
1130+ len (ns )
1131+ with self .assertRaises (TypeError ):
1132+ iter (ns )
1133+ with self .assertRaises (TypeError ):
1134+ 'spam' in ns
1135+ with self .assertRaises (TypeError ):
1136+ ns ['spam' ]
1137+
1138+
9991139def test_main ():
1000- run_unittest (TypesTests , MappingProxyTests , ClassCreationTests )
1140+ run_unittest (TypesTests , MappingProxyTests , ClassCreationTests ,
1141+ SimpleNamespaceTests )
10011142
10021143if __name__ == '__main__' :
10031144 test_main ()
0 commit comments