@@ -71,18 +71,58 @@ mod test_adding_rows_without_metadata {
7171 Err ( e) => panic!( "Err from tables.{}: {:?}" , stringify!( adder) , e)
7272 }
7373 assert_eq!( tables. $table( ) . iter( ) . count( ) , 2 ) ;
74+ tables
7475 }
7576 } } ;
7677 }
7778
79+ macro_rules! compare_column_to_raw_column {
80+ ( $table: expr, $col: ident, $raw: ident) => {
81+ assert_eq!(
82+ $table. $col( ) . len( ) ,
83+ usize :: try_from( $table. num_rows( ) ) . unwrap( )
84+ ) ;
85+ assert_eq!(
86+ $table. $raw( ) . len( ) ,
87+ usize :: try_from( $table. num_rows( ) ) . unwrap( )
88+ ) ;
89+ assert!( $table
90+ . $col( )
91+ . iter( )
92+ . zip( $table. $raw( ) . iter( ) )
93+ . all( |( a, b) | a == b) )
94+ } ;
95+ }
96+
97+ macro_rules! compare_column_to_row {
98+ ( $table: expr, $col: ident, $target: ident) => {
99+ assert!( $table
100+ . $col( )
101+ . iter( )
102+ . zip( $table. iter( ) )
103+ . all( |( c, r) | c == & r. $target) ) ;
104+ } ;
105+ }
106+
78107 // NOTE: all functions arguments for adding rows are Into<T>
79108 // where T is one of our new types.
80109 // Further, functions taking multiple inputs of T are defined
81110 // as X: Into<T>, X2: Into<T>, etc., allowing mix-and-match.
82111
83112 #[ test]
84113 fn test_adding_edge ( ) {
85- add_row_without_metadata ! ( edges, add_edge, 0.1 , 0.5 , 0 , 1 ) ; // left, right, parent, child
114+ {
115+ let tables = add_row_without_metadata ! ( edges, add_edge, 0.1 , 0.5 , 0 , 1 ) ; // left, right, parent, child
116+ compare_column_to_raw_column ! ( tables. edges( ) , left_slice, left_slice_raw) ;
117+ compare_column_to_raw_column ! ( tables. edges( ) , right_slice, right_slice_raw) ;
118+ compare_column_to_raw_column ! ( tables. edges( ) , parent_slice, parent_slice_raw) ;
119+ compare_column_to_raw_column ! ( tables. edges( ) , child_slice, child_slice_raw) ;
120+
121+ compare_column_to_row ! ( tables. edges( ) , left_slice, left) ;
122+ compare_column_to_row ! ( tables. edges( ) , right_slice, right) ;
123+ compare_column_to_row ! ( tables. edges( ) , parent_slice, parent) ;
124+ compare_column_to_row ! ( tables. edges( ) , child_slice, child) ;
125+ }
86126 add_row_without_metadata ! ( edges, add_edge, tskit:: Position :: from( 0.1 ) , 0.5 , 0 , 1 ) ; // left, right, parent, child
87127 add_row_without_metadata ! ( edges, add_edge, 0.1 , tskit:: Position :: from( 0.5 ) , 0 , 1 ) ; // left, right, parent, child
88128 add_row_without_metadata ! (
@@ -105,8 +145,30 @@ mod test_adding_rows_without_metadata {
105145
106146 #[ test]
107147 fn test_adding_node ( ) {
108- add_row_without_metadata ! ( nodes, add_node, 0 , 0.1 , -1 , -1 ) ; // flags, time, population,
109- // individual
148+ {
149+ let tables =
150+ add_row_without_metadata ! ( nodes, add_node, tskit:: TSK_NODE_IS_SAMPLE , 0.1 , -1 , -1 ) ; // flags, time, population,
151+ // individual
152+ assert ! ( tables
153+ . nodes( )
154+ . flags_slice( )
155+ . iter( )
156+ . zip( tables. nodes( ) . flags_slice_raw( ) . iter( ) )
157+ . all( |( a, b) | a. bits( ) == * b) ) ;
158+ compare_column_to_raw_column ! ( tables. nodes( ) , time_slice, time_slice_raw) ;
159+ compare_column_to_raw_column ! ( tables. nodes( ) , population_slice, population_slice_raw) ;
160+ compare_column_to_raw_column ! ( tables. nodes( ) , individual_slice, individual_slice_raw) ;
161+
162+ assert ! ( tables
163+ . nodes( )
164+ . flags_slice( )
165+ . iter( )
166+ . zip( tables. nodes( ) . iter( ) )
167+ . all( |( c, r) | c == & r. flags) ) ;
168+ compare_column_to_row ! ( tables. nodes( ) , time_slice, time) ;
169+ compare_column_to_row ! ( tables. nodes( ) , population_slice, population) ;
170+ compare_column_to_row ! ( tables. nodes( ) , individual_slice, individual) ;
171+ }
110172 add_row_without_metadata ! (
111173 nodes,
112174 add_node,
@@ -120,7 +182,11 @@ mod test_adding_rows_without_metadata {
120182 #[ test]
121183 fn test_adding_site ( ) {
122184 // No ancestral state
123- add_row_without_metadata ! ( sites, add_site, 2. / 3. , None ) ;
185+ {
186+ let tables = add_row_without_metadata ! ( sites, add_site, 2. / 3. , None ) ;
187+ compare_column_to_raw_column ! ( tables. sites( ) , position_slice, position_slice_raw) ;
188+ compare_column_to_row ! ( tables. sites( ) , position_slice, position) ;
189+ }
124190 add_row_without_metadata ! ( sites, add_site, tskit:: Position :: from( 2. / 3. ) , None ) ;
125191 add_row_without_metadata ! ( sites, add_site, 2. / 3. , Some ( & [ 1_u8 ] ) ) ;
126192 add_row_without_metadata ! (
@@ -136,14 +202,40 @@ mod test_adding_rows_without_metadata {
136202 // site, node, parent mutation, time, derived_state
137203 // Each value is a different Into<T> so we skip doing
138204 // permutations
139- add_row_without_metadata ! ( mutations, add_mutation, 0 , 0 , -1 , 0.0 , None ) ;
205+ {
206+ let tables = add_row_without_metadata ! ( mutations, add_mutation, 0 , 0 , -1 , 0.0 , None ) ;
207+ compare_column_to_raw_column ! ( tables. mutations( ) , node_slice, node_slice_raw) ;
208+ compare_column_to_raw_column ! ( tables. mutations( ) , time_slice, time_slice_raw) ;
209+ compare_column_to_raw_column ! ( tables. mutations( ) , site_slice, site_slice_raw) ;
210+ compare_column_to_raw_column ! ( tables. mutations( ) , parent_slice, parent_slice_raw) ;
211+
212+ compare_column_to_row ! ( tables. mutations( ) , node_slice, node) ;
213+ compare_column_to_row ! ( tables. mutations( ) , time_slice, time) ;
214+ compare_column_to_row ! ( tables. mutations( ) , site_slice, site) ;
215+ compare_column_to_row ! ( tables. mutations( ) , parent_slice, parent) ;
216+ }
217+
140218 add_row_without_metadata ! ( mutations, add_mutation, 0 , 0 , -1 , 0.0 , Some ( & [ 23_u8 ] ) ) ;
141219 }
142220
143221 #[ test]
144222 fn test_adding_individual ( ) {
145223 // flags, location, parents
146- add_row_without_metadata ! ( individuals, add_individual, 0 , None , None ) ;
224+ {
225+ let tables = add_row_without_metadata ! ( individuals, add_individual, 0 , None , None ) ;
226+ assert ! ( tables
227+ . individuals( )
228+ . flags_slice( )
229+ . iter( )
230+ . zip( tables. individuals( ) . flags_slice_raw( ) . iter( ) )
231+ . all( |( a, b) | a. bits( ) == * b) ) ;
232+ assert ! ( tables
233+ . individuals( )
234+ . flags_slice( )
235+ . iter( )
236+ . zip( tables. individuals( ) . iter( ) )
237+ . all( |( c, r) | c == & r. flags) ) ;
238+ }
147239 add_row_without_metadata ! (
148240 individuals,
149241 add_individual,
@@ -179,7 +271,23 @@ mod test_adding_rows_without_metadata {
179271 fn test_adding_migration ( ) {
180272 // migration table
181273 // (left, right), node, (source, dest), time
182- add_row_without_metadata ! ( migrations, add_migration, ( 0. , 1. ) , 0 , ( 0 , 1 ) , 0.0 ) ;
274+ {
275+ let tables =
276+ add_row_without_metadata ! ( migrations, add_migration, ( 0. , 1. ) , 0 , ( 0 , 1 ) , 0.0 ) ;
277+ compare_column_to_raw_column ! ( tables. migrations( ) , left_slice, left_slice_raw) ;
278+ compare_column_to_raw_column ! ( tables. migrations( ) , right_slice, right_slice_raw) ;
279+ compare_column_to_raw_column ! ( tables. migrations( ) , node_slice, node_slice_raw) ;
280+ compare_column_to_raw_column ! ( tables. migrations( ) , time_slice, time_slice_raw) ;
281+ compare_column_to_raw_column ! ( tables. migrations( ) , source_slice, source_slice_raw) ;
282+ compare_column_to_raw_column ! ( tables. migrations( ) , dest_slice, dest_slice_raw) ;
283+
284+ compare_column_to_row ! ( tables. migrations( ) , left_slice, left) ;
285+ compare_column_to_row ! ( tables. migrations( ) , right_slice, right) ;
286+ compare_column_to_row ! ( tables. migrations( ) , node_slice, node) ;
287+ compare_column_to_row ! ( tables. migrations( ) , time_slice, time) ;
288+ compare_column_to_row ! ( tables. migrations( ) , source_slice, source) ;
289+ compare_column_to_row ! ( tables. migrations( ) , dest_slice, dest) ;
290+ }
183291 add_row_without_metadata ! (
184292 migrations,
185293 add_migration,
0 commit comments