pub(super) struct ImportBlock {
binding_package: String,
paths: Vec<String>,
}
impl ImportBlock {
pub(super) fn new(binding_package: String) -> Self {
Self {
binding_package,
paths: Vec::new(),
}
}
pub(super) fn push(&mut self, path: &str) {
if !self.paths.iter().any(|existing| existing == path) {
self.paths.push(path.to_string());
}
}
pub(super) fn push_binding_type(&mut self, type_name: &str) {
let path = crate::codegen::naming::qualified_type_path(&self.binding_package, type_name);
self.push(&path);
}
pub(super) fn render(&self) -> String {
crate::e2e::template_env::render(
"kotlin/test_imports.kt.jinja",
minijinja::context! { imports => self.paths },
)
}
}
#[cfg(test)]
mod tests {
use super::ImportBlock;
const BINDING_PACKAGE: &str = "dev.sample.bindings";
fn block() -> ImportBlock {
ImportBlock::new(BINDING_PACKAGE.to_string())
}
#[test]
fn bare_binding_type_is_qualified_with_the_binding_package() {
let mut imports = block();
imports.push_binding_type("SampleClient");
assert_eq!(imports.render(), "import dev.sample.bindings.SampleClient\n");
}
#[test]
fn already_qualified_binding_type_is_left_alone() {
let mut imports = block();
imports.push_binding_type("dev.sample.bindings.SampleClient");
assert_eq!(imports.render(), "import dev.sample.bindings.SampleClient\n");
}
#[test]
fn the_two_spellings_of_one_type_collapse_to_a_single_import() {
let mut imports = block();
imports.push_binding_type("dev.sample.bindings.SampleClient");
imports.push_binding_type("SampleClient");
assert_eq!(imports.render(), "import dev.sample.bindings.SampleClient\n");
}
#[test]
fn insertion_order_is_preserved_and_non_binding_paths_are_untouched() {
let mut imports = block();
imports.push("org.junit.jupiter.api.Test");
imports.push_binding_type("SampleOptions");
imports.push("kotlin.test.assertEquals");
assert_eq!(
imports.render(),
"import org.junit.jupiter.api.Test\nimport dev.sample.bindings.SampleOptions\nimport kotlin.test.assertEquals\n"
);
}
#[test]
fn an_empty_block_renders_nothing() {
assert_eq!(block().render(), "");
}
}