Skip to content

Commit 760f431

Browse files
committed
test: metadata without serde
1 parent 1227ac8 commit 760f431

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,6 @@ required-features = ["derive"]
6464
[[example]]
6565
name = "bincode_metadata"
6666
required-features = ["derive"]
67+
68+
[[example]]
69+
name = "manual_metadata_encoding"
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
use tskit::metadata::MetadataRoundtrip;
2+
3+
struct MutationMetadata {
4+
effect_size: f64,
5+
dominance: f64,
6+
}
7+
8+
impl MetadataRoundtrip for MutationMetadata {
9+
fn encode(&self) -> Result<Vec<u8>, tskit::metadata::MetadataError> {
10+
let mut rv = vec![];
11+
rv.extend_from_slice(&self.effect_size.to_be_bytes());
12+
rv.extend_from_slice(&self.dominance.to_be_bytes());
13+
Ok(rv)
14+
}
15+
16+
fn decode(md: &[u8]) -> Result<Self, tskit::metadata::MetadataError>
17+
where
18+
Self: Sized,
19+
{
20+
let slice: [u8; 8] = md[0..8].try_into().unwrap();
21+
let effect_size = f64::from_be_bytes(slice);
22+
let slice: [u8; 8] = md[8..].try_into().unwrap();
23+
let dominance = f64::from_be_bytes(slice);
24+
Ok(Self {
25+
effect_size,
26+
dominance,
27+
})
28+
}
29+
}
30+
31+
impl tskit::metadata::MutationMetadata for MutationMetadata {}
32+
33+
struct IndividualMetadata {
34+
name: String,
35+
phenotypes: Vec<i32>,
36+
}
37+
38+
impl MetadataRoundtrip for IndividualMetadata {
39+
fn encode(&self) -> Result<Vec<u8>, tskit::metadata::MetadataError> {
40+
todo!()
41+
}
42+
fn decode(md: &[u8]) -> Result<Self, tskit::metadata::MetadataError>
43+
where
44+
Self: Sized,
45+
{
46+
todo!()
47+
}
48+
}
49+
50+
impl tskit::metadata::IndividualMetadata for IndividualMetadata {}
51+
52+
fn main() {
53+
let ts = make_treeseq().unwrap();
54+
ts.dump("with_json_metadata.trees", 0).unwrap();
55+
}
56+
57+
fn make_tables() -> anyhow::Result<tskit::TableCollection> {
58+
let mut tables = tskit::TableCollection::new(100.0)?;
59+
let pop0 = tables.add_population()?;
60+
let ind0 = tables.add_individual_with_metadata(
61+
0,
62+
None,
63+
None,
64+
&IndividualMetadata {
65+
name: "Jerome".to_string(),
66+
phenotypes: vec![0, 1, 2, 0],
67+
},
68+
)?;
69+
let node0 = tables.add_node(tskit::NodeFlags::new_sample(), 0.0, pop0, ind0)?;
70+
let site0 = tables.add_site(50.0, Some("A".as_bytes()))?;
71+
let _ = tables.add_mutation_with_metadata(
72+
site0,
73+
node0,
74+
tskit::MutationId::NULL,
75+
1.0,
76+
Some("G".as_bytes()),
77+
&MutationMetadata {
78+
effect_size: -1e-3,
79+
dominance: 0.1,
80+
},
81+
)?;
82+
tables.build_index()?;
83+
Ok(tables)
84+
}
85+
86+
fn make_treeseq() -> anyhow::Result<tskit::TreeSequence> {
87+
Ok(make_tables()?.tree_sequence(0)?)
88+
}
89+
90+
#[test]
91+
fn test_mutation_metadata_roundtrip() {
92+
let md = MutationMetadata {
93+
effect_size: 0.1,
94+
dominance: 0.25,
95+
};
96+
let encoded = md.encode().unwrap();
97+
let decoded = MutationMetadata::decode(&encoded).unwrap();
98+
assert_eq!(md.effect_size, decoded.effect_size);
99+
assert_eq!(md.dominance, decoded.dominance);
100+
}
101+
102+
#[test]
103+
fn test_individual_metadata_roundtrip() {
104+
let md = IndividualMetadata {
105+
name: "Jerome".to_string(), phenotypes: vec![10,9]
106+
};
107+
let encoded = md.encode().unwrap();
108+
let decoded = IndividualMetadata::decode(&encoded).unwrap();
109+
assert_eq!(md.name, decoded.name);
110+
assert_eq!(md.phenotypes, decoded.phenotypes);
111+
}

0 commit comments

Comments
 (0)