@@ -2109,6 +2109,103 @@ def test_sequence_length_longer_than_edges(self):
2109
2109
self .assertEqual (len (tree .parent_dict ), 0 )
2110
2110
2111
2111
2112
+ class TestTableCollectionMetadata (unittest .TestCase ):
2113
+
2114
+ metadata_schema = metadata .MetadataSchema (
2115
+ {
2116
+ "codec" : "json" ,
2117
+ "title" : "Example Metadata" ,
2118
+ "type" : "object" ,
2119
+ "properties" : {
2120
+ "one" : {"type" : "string" },
2121
+ "two" : {"type" : "number" },
2122
+ "three" : {"type" : "array" },
2123
+ "four" : {"type" : "boolean" },
2124
+ },
2125
+ "required" : ["one" , "two" , "three" , "four" ],
2126
+ "additionalProperties" : False ,
2127
+ },
2128
+ )
2129
+
2130
+ def metadata_example_data (self , val = 0 ):
2131
+ return {
2132
+ "one" : "val one" ,
2133
+ "two" : val ,
2134
+ "three" : list (range (val , val + 10 )),
2135
+ "four" : True ,
2136
+ }
2137
+
2138
+ def test_set_metadata_schema (self ):
2139
+ tc = tskit .TableCollection (1 )
2140
+ metadata_schema2 = metadata .MetadataSchema ({"codec" : "json" })
2141
+ # Default is no-op metadata codec
2142
+ self .assertEqual (str (tc .metadata_schema ), str (metadata .MetadataSchema (None )))
2143
+ # Set
2144
+ tc .metadata_schema = self .metadata_schema
2145
+ self .assertEqual (str (tc .metadata_schema ), str (self .metadata_schema ))
2146
+ # Overwrite
2147
+ tc .metadata_schema = metadata_schema2
2148
+ self .assertEqual (str (tc .metadata_schema ), str (metadata_schema2 ))
2149
+ # Remove
2150
+ tc .metadata_schema = ""
2151
+ self .assertEqual (str (tc .metadata_schema ), str (metadata .MetadataSchema (None )))
2152
+ # Set after remove
2153
+ tc .metadata_schema = self .metadata_schema
2154
+ self .assertEqual (str (tc .metadata_schema ), str (self .metadata_schema ))
2155
+ # Del should fail
2156
+ with self .assertRaises (AttributeError ):
2157
+ del tc .metadata_schema
2158
+ # None should fail
2159
+ with self .assertRaises (ValueError ):
2160
+ tc .metadata_schema = None
2161
+
2162
+ def test_set_metadata (self ):
2163
+ tc = tskit .TableCollection (1 )
2164
+ # Default is empty bytes
2165
+ self .assertEqual (tc .metadata , b"" )
2166
+
2167
+ tc .metadata_schema = self .metadata_schema
2168
+ md1 = self .metadata_example_data ()
2169
+ md2 = self .metadata_example_data (val = 2 )
2170
+ # Set
2171
+ tc .metadata = md1
2172
+ self .assertEqual (tc .metadata , md1 )
2173
+ # Overwrite
2174
+ tc .metadata = md2
2175
+ self .assertEqual (tc .metadata , md2 )
2176
+ # Del should fail
2177
+ with self .assertRaises (AttributeError ):
2178
+ del tc .metadata
2179
+ # None should fail
2180
+ with self .assertRaises (exceptions .MetadataValidationError ):
2181
+ tc .metadata = None
2182
+
2183
+ def test_default_metadata_schema (self ):
2184
+ # Default should allow bytes
2185
+ tc = tskit .TableCollection (1 )
2186
+ tc .metadata = b"acceptable bytes"
2187
+ self .assertEqual (tc .metadata , b"acceptable bytes" )
2188
+ # Adding non-bytes metadata should error
2189
+ with self .assertRaises (TypeError ):
2190
+ tc .metadata = self .metadata_example_data ()
2191
+
2192
+ def test_round_trip_metadata (self ):
2193
+ data = self .metadata_example_data ()
2194
+ tc = tskit .TableCollection (1 )
2195
+ tc .metadata_schema = self .metadata_schema
2196
+ tc .metadata = data
2197
+ self .assertDictEqual (tc .metadata , data )
2198
+
2199
+ def test_bad_metadata (self ):
2200
+ metadata = self .metadata_example_data ()
2201
+ metadata ["I really shouldn't be here" ] = 6
2202
+ tc = tskit .TableCollection (1 )
2203
+ tc .metadata_schema = self .metadata_schema
2204
+ with self .assertRaises (exceptions .MetadataValidationError ):
2205
+ tc .metadata = metadata
2206
+ self .assertEqual (tc .ll_tables .metadata , b"" )
2207
+
2208
+
2112
2209
class TestTableCollectionPickle (unittest .TestCase ):
2113
2210
"""
2114
2211
Tests that we can round-trip table collections through pickle.
0 commit comments