use crate::core::config::ResolvedCrateConfig;
use crate::core::config::e2e::CallOverride;
use crate::e2e::config::{CallConfig, E2eConfig};
use crate::e2e::fixture::Fixture;
use std::collections::HashMap;
const BINDING_PACKAGE: &str = "dev.sample.bindings";
const SIMPLE_CLASS: &str = "SampleClient";
fn call_fixture() -> Fixture {
Fixture {
id: "smoke_basic".to_string(),
description: "smoke test".to_string(),
input: serde_json::json!({}),
..Fixture::default()
}
}
fn e2e_config_with_class(class: &str) -> E2eConfig {
let mut overrides = HashMap::new();
overrides.insert(
"kotlin_android".to_string(),
CallOverride {
class: Some(class.to_string()),
..CallOverride::default()
},
);
E2eConfig {
call: CallConfig {
function: "convert".to_string(),
overrides,
..CallConfig::default()
},
..E2eConfig::default()
}
}
fn render(class: &str) -> String {
super::test_file::render_test_file_inner(
"smoke",
&[&call_fixture()],
class,
"convert",
BINDING_PACKAGE,
"result",
&[],
None,
false,
&e2e_config_with_class(class),
&HashMap::new(),
true,
&ResolvedCrateConfig::default(),
&[],
&[],
&[],
)
.expect("kotlin_android smoke test file renders")
}
fn import_lines(rendered: &str) -> Vec<&str> {
rendered.lines().filter(|line| line.starts_with("import ")).collect()
}
#[test]
fn fully_qualified_call_class_is_never_double_qualified() {
let fully_qualified = format!("{BINDING_PACKAGE}.{SIMPLE_CLASS}");
let rendered = render(&fully_qualified);
let doubled = format!("import {BINDING_PACKAGE}.{fully_qualified}");
assert!(
!rendered.contains(&doubled),
"the binding package must not be prefixed onto an already-qualified class; got:\n{rendered}"
);
assert!(
import_lines(&rendered).contains(&format!("import {fully_qualified}").as_str()),
"the class must still be imported at its own package; got:\n{rendered}"
);
}
#[test]
fn call_class_is_imported_exactly_once() {
let fully_qualified = format!("{BINDING_PACKAGE}.{SIMPLE_CLASS}");
let rendered = render(&fully_qualified);
let imports = import_lines(&rendered);
let mut sorted = imports.clone();
sorted.sort_unstable();
let before_dedup = sorted.len();
sorted.dedup();
assert_eq!(
sorted.len(),
before_dedup,
"no import may be emitted twice; got:\n{imports:#?}"
);
}
#[test]
fn bare_call_class_is_qualified_with_the_binding_package() {
let rendered = render(SIMPLE_CLASS);
assert!(
import_lines(&rendered).contains(&format!("import {BINDING_PACKAGE}.{SIMPLE_CLASS}").as_str()),
"a bare class name must be qualified with the binding package; got:\n{rendered}"
);
}