Skip to content

Commit 7827d78

Browse files
committed
Add tests for namespace sorter.
1 parent 0f8ab22 commit 7827d78

File tree

2 files changed

+90
-0
lines changed

2 files changed

+90
-0
lines changed

gen/src/namespace_organizer.rs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,81 @@ impl<'a> NamespaceEntries<'a> {
4848
root
4949
}
5050
}
51+
52+
#[cfg(test)]
53+
mod tests {
54+
use super::NamespaceEntries;
55+
use crate::syntax::namespace::Namespace;
56+
use crate::syntax::{Api, Doc, ExternType, Pair};
57+
use proc_macro2::{Ident, Span};
58+
use syn::Token;
59+
60+
#[test]
61+
fn test_ns_entries_sort() {
62+
let entries = vec![
63+
make_api(None, "C"),
64+
make_api(None, "A"),
65+
make_api(Some("G"), "E"),
66+
make_api(Some("D"), "F"),
67+
make_api(Some("G"), "H"),
68+
make_api(Some("D::K"), "L"),
69+
make_api(Some("D::K"), "M"),
70+
make_api(None, "B"),
71+
make_api(Some("D"), "I"),
72+
make_api(Some("D"), "J"),
73+
];
74+
let ns = NamespaceEntries::new(&entries);
75+
let root_entries = ns.entries();
76+
assert_eq!(root_entries.len(), 3);
77+
assert_ident(root_entries[0], "C");
78+
assert_ident(root_entries[1], "A");
79+
assert_ident(root_entries[2], "B");
80+
let mut kids = ns.children();
81+
let (d_id, d_nse) = kids.next().unwrap();
82+
assert_eq!(d_id.to_string(), "D");
83+
let (g_id, g_nse) = kids.next().unwrap();
84+
assert_eq!(g_id.to_string(), "G");
85+
assert!(kids.next().is_none());
86+
let d_nse_entries = d_nse.entries();
87+
assert_eq!(d_nse_entries.len(), 3);
88+
assert_ident(d_nse_entries[0], "F");
89+
assert_ident(d_nse_entries[1], "I");
90+
assert_ident(d_nse_entries[2], "J");
91+
let g_nse_entries = g_nse.entries();
92+
assert_eq!(g_nse_entries.len(), 2);
93+
assert_ident(g_nse_entries[0], "E");
94+
assert_ident(g_nse_entries[1], "H");
95+
let mut g_kids = g_nse.children();
96+
assert!(g_kids.next().is_none());
97+
let mut d_kids = d_nse.children();
98+
let (k_id, k_nse) = d_kids.next().unwrap();
99+
assert_eq!(k_id.to_string(), "K");
100+
let k_nse_entries = k_nse.entries();
101+
assert_eq!(k_nse_entries.len(), 2);
102+
assert_ident(k_nse_entries[0], "L");
103+
assert_ident(k_nse_entries[1], "M");
104+
}
105+
106+
fn assert_ident(api: &Api, expected: &str) {
107+
if let Api::CxxType(cxx_type) = api {
108+
assert_eq!(cxx_type.ident.cxx.ident.to_string(), expected);
109+
} else {
110+
unreachable!()
111+
}
112+
}
113+
114+
fn make_api(ns: Option<&str>, ident: &str) -> Api {
115+
let ns = match ns {
116+
Some(st) => Namespace::from_str(st),
117+
None => Namespace::none(),
118+
};
119+
let ident = Pair::new(ns, Ident::new(ident, Span::call_site()));
120+
Api::CxxType(ExternType {
121+
doc: Doc::new(),
122+
type_token: Token![type](Span::call_site()),
123+
ident,
124+
semi_token: Token![;](Span::call_site()),
125+
trusted: true,
126+
})
127+
}
128+
}

syntax/namespace.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
use crate::syntax::qualified::QualifiedName;
2+
#[cfg(test)]
3+
use proc_macro2::Span;
24
use quote::IdentFragment;
35
use std::fmt::{self, Display};
46
use std::slice::Iter;
@@ -36,6 +38,16 @@ impl Namespace {
3638
input.parse::<Option<Token![,]>>()?;
3739
Ok(ns)
3840
}
41+
42+
#[cfg(test)]
43+
pub fn from_str(ns: &str) -> Self {
44+
Namespace {
45+
segments: ns
46+
.split("::")
47+
.map(|x| Ident::new(x, Span::call_site()))
48+
.collect(),
49+
}
50+
}
3951
}
4052

4153
impl Parse for Namespace {

0 commit comments

Comments
 (0)