@@ -2109,6 +2109,103 @@ def test_sequence_length_longer_than_edges(self):
21092109 self .assertEqual (len (tree .parent_dict ), 0 )
21102110
21112111
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+
21122209class TestTableCollectionPickle (unittest .TestCase ):
21132210 """
21142211 Tests that we can round-trip table collections through pickle.
0 commit comments