use type_state_builder::TypeStateBuilder;
#[cfg(test)]
mod field_level_attributes {
use super::*;
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct RequiredBasic {
#[builder(required)]
name: String,
}
#[test]
fn test_required_basic() {
let instance = RequiredBasic::builder().name("test".to_string()).build();
assert_eq!(instance.name, "test");
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct RequiredWithSetterName {
#[builder(required, setter_name = "set_title")]
name: String,
}
#[test]
fn test_required_with_setter_name() {
let instance = RequiredWithSetterName::builder()
.set_title("test".to_string())
.build();
assert_eq!(instance.name, "test");
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct RequiredWithSetterPrefix {
#[builder(required, setter_prefix = "with_")]
name: String,
}
#[test]
fn test_required_with_setter_prefix() {
let instance = RequiredWithSetterPrefix::builder()
.with_name("test".to_string())
.build();
assert_eq!(instance.name, "test");
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct RequiredWithSetterNameAndPrefix {
#[builder(required, setter_name = "title", setter_prefix = "set_")]
name: String,
}
#[test]
fn test_required_with_setter_name_and_prefix() {
let instance = RequiredWithSetterNameAndPrefix::builder()
.set_title("test".to_string())
.build();
assert_eq!(instance.name, "test");
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct OptionalWithDefault {
#[builder(default = "default_value".to_string())]
name: String,
}
#[test]
fn test_optional_with_default() {
let instance = OptionalWithDefault::builder().build();
assert_eq!(instance.name, "default_value");
let instance = OptionalWithDefault::builder()
.name("custom".to_string())
.build();
assert_eq!(instance.name, "custom");
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct OptionalWithDefaultAndSetterName {
#[builder(default = 42, setter_name = "set_value")]
count: i32,
}
#[test]
fn test_optional_with_default_and_setter_name() {
let instance = OptionalWithDefaultAndSetterName::builder().build();
assert_eq!(instance.count, 42);
let instance = OptionalWithDefaultAndSetterName::builder()
.set_value(100)
.build();
assert_eq!(instance.count, 100);
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct OptionalWithDefaultSetterNameAndPrefix {
#[builder(default = true, setter_name = "enabled", setter_prefix = "with_")]
active: bool,
}
#[test]
fn test_optional_with_default_setter_name_and_prefix() {
let instance = OptionalWithDefaultSetterNameAndPrefix::builder().build();
assert!(instance.active);
let instance = OptionalWithDefaultSetterNameAndPrefix::builder()
.with_enabled(false)
.build();
assert!(!instance.active);
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct SkipSetterWithDefault {
name: String,
#[builder(skip_setter, default = "auto_generated".to_string())]
id: String,
}
#[test]
fn test_skip_setter_with_default() {
let instance = SkipSetterWithDefault::builder()
.name("test".to_string())
.build();
assert_eq!(instance.name, "test");
assert_eq!(instance.id, "auto_generated");
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct SkipSetterWithoutDefault {
name: String,
#[builder(skip_setter, default = Default::default())]
count: i32, }
#[test]
fn test_skip_setter_without_default() {
let instance = SkipSetterWithoutDefault::builder()
.name("test".to_string())
.build();
assert_eq!(instance.name, "test");
assert_eq!(instance.count, 0);
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct FieldLevelImplInto {
#[builder(impl_into = true)]
name: String,
#[builder(impl_into = false)]
exact_type: String,
regular_field: String,
}
#[test]
fn test_field_level_impl_into() {
let instance = FieldLevelImplInto::builder()
.name("test") .exact_type("exact".to_string()) .regular_field("regular".to_string())
.build();
assert_eq!(instance.name, "test");
assert_eq!(instance.exact_type, "exact");
assert_eq!(instance.regular_field, "regular");
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct ImplIntoWithCustomization {
#[builder(impl_into = true, setter_name = "set_title", setter_prefix = "with_")]
name: String,
}
#[test]
fn test_impl_into_with_customization() {
let instance = ImplIntoWithCustomization::builder()
.with_set_title("test") .build();
assert_eq!(instance.name, "test");
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct ImplIntoWithDefault {
#[builder(impl_into = true, default = "default".to_string())]
name: String,
}
#[test]
fn test_impl_into_with_default() {
let instance = ImplIntoWithDefault::builder().build();
assert_eq!(instance.name, "default");
let instance = ImplIntoWithDefault::builder()
.name("custom") .build();
assert_eq!(instance.name, "custom");
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct RequiredWithImplInto {
#[builder(required, impl_into = true)]
name: String,
}
#[test]
fn test_required_with_impl_into() {
let instance = RequiredWithImplInto::builder()
.name("test") .build();
assert_eq!(instance.name, "test");
}
}
#[cfg(test)]
mod converter_combinations {
use super::*;
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct BasicConverter {
#[builder(converter = |value: Vec<&str>| value.into_iter().map(|s| s.to_string()).collect())]
tags: Vec<String>,
}
#[test]
fn test_basic_converter() {
let instance = BasicConverter::builder()
.tags(vec!["rust", "builder"])
.build();
assert_eq!(
instance.tags,
vec!["rust".to_string(), "builder".to_string()]
);
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct RequiredConverter {
#[builder(required, converter = |value: &str| value.to_uppercase())]
name: String,
}
#[test]
fn test_required_converter() {
let instance = RequiredConverter::builder().name("test").build();
assert_eq!(instance.name, "TEST");
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct ConverterWithSetterName {
#[builder(converter = |value: i32| value * 2, setter_name = "double_value")]
number: i32,
}
#[test]
fn test_converter_with_setter_name() {
let instance = ConverterWithSetterName::builder().double_value(21).build();
assert_eq!(instance.number, 42);
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct ConverterWithSetterPrefix {
#[builder(converter = |value: f32| value as i32, setter_prefix = "set_")]
value: i32,
}
#[test]
fn test_converter_with_setter_prefix() {
let instance = ConverterWithSetterPrefix::builder().set_value(42.7).build();
assert_eq!(instance.value, 42);
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct ConverterWithSetterNameAndPrefix {
#[builder(converter = |values: (i32, i32)| values.0 + values.1, setter_name = "sum", setter_prefix = "with_")]
total: i32,
}
#[test]
fn test_converter_with_setter_name_and_prefix() {
let instance = ConverterWithSetterNameAndPrefix::builder()
.with_sum((10, 32))
.build();
assert_eq!(instance.total, 42);
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct ConverterWithDefault {
#[builder(converter = |value: Option<String>| value.unwrap_or_else(|| "fallback".to_string()), default = "default".to_string())]
name: String,
}
#[test]
fn test_converter_with_default() {
let instance = ConverterWithDefault::builder().build();
assert_eq!(instance.name, "default");
let instance = ConverterWithDefault::builder()
.name(Some("custom".to_string()))
.build();
assert_eq!(instance.name, "custom");
let instance = ConverterWithDefault::builder().name(None).build();
assert_eq!(instance.name, "fallback");
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct RequiredConverterComplete {
#[builder(required, converter = |value: Vec<i32>| format!("{value:?}"), setter_name = "numbers", setter_prefix = "with_")]
formatted: String,
}
#[test]
fn test_required_converter_complete() {
let instance = RequiredConverterComplete::builder()
.with_numbers(vec![1, 2, 3])
.build();
assert_eq!(instance.formatted, "[1, 2, 3]");
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct ComplexConverter {
#[builder(converter = |value: std::collections::HashMap<String, i32>| {
value.into_iter()
.filter(|(_, count)| *count > 0)
.map(|(name, count)| format!("{name}:{count}"))
.collect()
})]
items: Vec<String>,
}
#[test]
fn test_complex_converter() {
let mut map = std::collections::HashMap::new();
map.insert("valid".to_string(), 5);
map.insert("invalid".to_string(), 0);
map.insert("another".to_string(), 3);
let instance = ComplexConverter::builder().items(map).build();
let mut result = instance.items;
result.sort();
assert_eq!(result, vec!["another:3", "valid:5"]);
}
}
#[cfg(test)]
mod struct_level_attributes {
use super::*;
#[derive(TypeStateBuilder, Debug, PartialEq)]
#[builder(build_method = "create")]
struct CustomBuildMethod {
name: String,
}
#[test]
fn test_custom_build_method() {
let instance = CustomBuildMethod::builder()
.name("test".to_string())
.create();
assert_eq!(instance.name, "test");
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
#[builder(setter_prefix = "with_")]
struct StructSetterPrefix {
name: String,
age: i32,
}
#[test]
fn test_struct_setter_prefix() {
let instance = StructSetterPrefix::builder()
.with_name("test".to_string())
.with_age(25)
.build();
assert_eq!(instance.name, "test");
assert_eq!(instance.age, 25);
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
#[builder(impl_into)]
struct StructImplInto {
name: String,
path: std::path::PathBuf,
}
#[test]
fn test_struct_impl_into() {
let instance = StructImplInto::builder()
.name("test") .path("/tmp/test") .build();
assert_eq!(instance.name, "test");
assert_eq!(instance.path, std::path::PathBuf::from("/tmp/test"));
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
#[builder(build_method = "create", setter_prefix = "with_", impl_into)]
struct AllStructAttributes {
name: String,
count: i32,
}
#[test]
fn test_all_struct_attributes() {
let instance = AllStructAttributes::builder()
.with_name("test") .with_count(42)
.create(); assert_eq!(instance.name, "test");
assert_eq!(instance.count, 42);
}
}
#[cfg(test)]
mod struct_field_interactions {
use super::*;
#[derive(TypeStateBuilder, Debug, PartialEq)]
#[builder(impl_into)]
struct StructImplIntoWithOverrides {
#[builder(impl_into = false)] exact_name: String,
inherit_name: String, #[builder(impl_into = true)] explicit_name: String,
}
#[test]
fn test_struct_impl_into_with_overrides() {
let instance = StructImplIntoWithOverrides::builder()
.exact_name("exact".to_string()) .inherit_name("inherit") .explicit_name("explicit") .build();
assert_eq!(instance.exact_name, "exact");
assert_eq!(instance.inherit_name, "inherit");
assert_eq!(instance.explicit_name, "explicit");
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
#[builder(setter_prefix = "with_")]
struct StructPrefixWithOverrides {
inherit_field: String, #[builder(setter_prefix = "set_")] override_field: String,
#[builder(setter_name = "custom_method")] custom_field: String,
}
#[test]
fn test_struct_prefix_with_overrides() {
let instance = StructPrefixWithOverrides::builder()
.with_inherit_field("inherit".to_string()) .set_override_field("override".to_string()) .with_custom_method("custom".to_string()) .build();
assert_eq!(instance.inherit_field, "inherit");
assert_eq!(instance.override_field, "override");
assert_eq!(instance.custom_field, "custom");
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
#[builder(build_method = "construct", setter_prefix = "with_", impl_into)]
struct ComplexInteraction {
#[builder(required, converter = |value: &str| value.to_uppercase(), setter_name = "title")]
name: String,
#[builder(impl_into = false, setter_prefix = "set_")]
exact_value: String,
#[builder(default = 42)]
count: i32,
#[builder(skip_setter, default = "auto".to_string())]
id: String,
}
#[test]
fn test_complex_interaction() {
let instance = ComplexInteraction::builder()
.with_title("test") .set_exact_value("exact".to_string()) .with_count(100) .construct();
assert_eq!(instance.name, "TEST"); assert_eq!(instance.exact_value, "exact");
assert_eq!(instance.count, 100);
assert_eq!(instance.id, "auto"); }
#[derive(TypeStateBuilder, Debug, PartialEq)]
#[builder(setter_prefix = "with_")]
struct MixedFieldTypes {
#[builder(required)]
required_basic: String,
#[builder(required, setter_name = "set_id")]
required_custom: i32,
#[builder(default = "optional".to_string())]
optional_default: String,
#[builder(converter = |value: Vec<i32>| value.into_iter().sum())]
optional_converter: i32,
#[builder(skip_setter, default = true)]
skip_field: bool,
}
#[test]
fn test_mixed_field_types() {
let instance = MixedFieldTypes::builder()
.with_required_basic("basic".to_string())
.with_set_id(123)
.with_optional_converter(vec![10, 20, 30])
.build();
assert_eq!(instance.required_basic, "basic");
assert_eq!(instance.required_custom, 123);
assert_eq!(instance.optional_default, "optional"); assert_eq!(instance.optional_converter, 60); assert!(instance.skip_field); }
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct OnlyOptionalFields {
#[builder(default = "default1".to_string())]
field1: String,
#[builder(skip_setter, default = "skip_default".to_string())]
field2: String,
#[builder(converter = |value: Option<i32>| value.unwrap_or(0))]
field3: i32,
}
#[test]
fn test_only_optional_fields() {
let instance = OnlyOptionalFields::builder().build();
assert_eq!(instance.field1, "default1");
assert_eq!(instance.field2, "skip_default");
assert_eq!(instance.field3, 0);
let instance = OnlyOptionalFields::builder()
.field1("custom1".to_string())
.field3(Some(42))
.build();
assert_eq!(instance.field1, "custom1");
assert_eq!(instance.field2, "skip_default"); assert_eq!(instance.field3, 42);
}
}
#[cfg(test)]
mod generics_with_attributes {
use super::*;
#[derive(TypeStateBuilder, Debug, PartialEq)]
#[builder(setter_prefix = "with_")]
struct GenericWithAttributes<T>
where
T: Clone + std::fmt::Debug,
{
#[builder(required)]
data: T,
#[builder(converter = |value: Vec<&str>| value.into_iter().map(|s| s.to_string()).collect())]
tags: Vec<String>,
#[builder(default = 42)]
count: i32,
}
#[test]
fn test_generic_with_attributes() {
let instance = GenericWithAttributes::<String>::builder()
.with_data("test".to_string())
.with_tags(vec!["rust", "generic"])
.with_count(100)
.build();
assert_eq!(instance.data, "test");
assert_eq!(
instance.tags,
vec!["rust".to_string(), "generic".to_string()]
);
assert_eq!(instance.count, 100);
}
#[derive(TypeStateBuilder, Debug)]
#[builder(impl_into)]
struct LifetimeWithAttributes<'a> {
#[builder(required)]
data: &'a str,
#[builder(converter = |value: Vec<&str>| value.join(","))]
combined: String,
}
#[test]
fn test_lifetime_with_attributes() {
let data = "test data";
let instance = LifetimeWithAttributes::builder()
.data(data) .combined(vec!["a", "b", "c"])
.build();
assert_eq!(instance.data, "test data");
assert_eq!(instance.combined, "a,b,c");
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
#[builder(build_method = "create")]
struct ConstGenericWithAttributes<const N: usize> {
#[builder(required)]
data: [i32; N],
#[builder(converter = |value: Vec<i32>| value.into_iter().sum())]
sum: i32,
}
#[test]
fn test_const_generic_with_attributes() {
let instance = ConstGenericWithAttributes::<3>::builder()
.data([1, 2, 3])
.sum(vec![10, 20, 30])
.create();
assert_eq!(instance.data, [1, 2, 3]);
assert_eq!(instance.sum, 60);
}
}
#[cfg(test)]
mod edge_cases_and_special_scenarios {
use core::f64;
use super::*;
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct RawIdentifiers {
#[builder(required, setter_name = "set_type")]
r#type: String,
#[builder(converter = |value: &str| format!("async_{value}"))]
r#async: String,
}
#[test]
fn test_raw_identifiers() {
let instance = RawIdentifiers::builder()
.set_type("test".to_string())
.r#async("operation")
.build();
assert_eq!(instance.r#type, "test");
assert_eq!(instance.r#async, "async_operation");
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct OnlySkipSetters {
#[builder(skip_setter, default = "auto1".to_string())]
field1: String,
#[builder(skip_setter, default = 42)]
field2: i32,
#[builder(skip_setter, default = true)]
field3: bool,
}
#[test]
fn test_only_skip_setters() {
let instance = OnlySkipSetters::builder().build();
assert_eq!(instance.field1, "auto1");
assert_eq!(instance.field2, 42);
assert!(instance.field3);
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
#[builder(build_method = "finish", setter_prefix = "use_")]
struct SingleRequiredComplete {
#[builder(
required,
impl_into = true,
setter_name = "value",
setter_prefix = "set_"
)]
data: String,
}
#[test]
fn test_single_required_complete() {
let instance = SingleRequiredComplete::builder()
.set_value("test") .finish(); assert_eq!(instance.data, "test");
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
#[builder(build_method = "construct", setter_prefix = "with_", impl_into)]
struct AllCombinations {
#[builder(required, converter = |value: &str| value.to_uppercase(), setter_name = "title", setter_prefix = "set_")]
name: String,
#[builder(required, impl_into = false, setter_name = "exact_age")]
age: i32,
#[builder(default = vec![], converter = |value: Vec<&str>| value.into_iter().map(|s| s.to_string()).collect())]
tags: Vec<String>,
#[builder(impl_into = true, setter_prefix = "use_")]
path: String,
#[builder(skip_setter, default = "generated".to_string())]
id: String,
description: String,
}
#[test]
fn test_all_combinations() {
let instance = AllCombinations::builder()
.set_title("test") .with_exact_age(25) .with_tags(vec!["rust", "test"]) .use_path("/tmp") .with_description("desc") .construct();
assert_eq!(instance.name, "TEST"); assert_eq!(instance.age, 25);
assert_eq!(instance.tags, vec!["rust".to_string(), "test".to_string()]);
assert_eq!(instance.path, "/tmp");
assert_eq!(instance.id, "generated"); assert_eq!(instance.description, "desc");
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct ComplexConverterTypes {
#[builder(converter = |value: (String, i32, bool)| format!("{}:{}:{}", value.0, value.1, value.2))]
formatted: String,
#[builder(converter = |value: Result<String, String>| value.ok())]
maybe_value: Option<String>,
#[builder(converter = |value: Box<dyn Fn(i32) -> i32>| value(42))]
computed: i32,
#[builder(converter = |value: std::collections::BTreeMap<String, Vec<i32>>| {
value.into_iter()
.map(|(k, v)| (k, v.into_iter().sum::<i32>()))
.collect()
})]
summary: std::collections::BTreeMap<String, i32>,
}
#[test]
fn test_complex_converter_types() {
let mut btree = std::collections::BTreeMap::new();
btree.insert("group1".to_string(), vec![1, 2, 3]);
btree.insert("group2".to_string(), vec![10, 20]);
let instance = ComplexConverterTypes::builder()
.formatted(("test".to_string(), 42, true))
.maybe_value(Ok("success".to_string()))
.computed(Box::new(|x| x * 2) as Box<dyn Fn(i32) -> i32>)
.summary(btree)
.build();
assert_eq!(instance.formatted, "test:42:true");
assert_eq!(instance.maybe_value, Some("success".to_string()));
assert_eq!(instance.computed, 84);
let mut expected_summary = std::collections::BTreeMap::new();
expected_summary.insert("group1".to_string(), 6); expected_summary.insert("group2".to_string(), 30); assert_eq!(instance.summary, expected_summary);
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
#[builder(impl_into)]
struct NestedGenerics<T>
where
T: Clone + std::fmt::Debug,
{
#[builder(required)]
data: Vec<Option<T>>,
#[builder(converter = |value: Vec<f64>| value.into_iter().map(|u| format!("{u}")).collect())]
formatted: Vec<String>,
#[builder(default = std::collections::HashMap::new())]
map: std::collections::HashMap<String, T>,
}
#[test]
fn test_nested_generics() {
let instance = NestedGenerics::<i32>::builder()
.data(vec![Some(1), None, Some(3)]) .formatted(vec![1.5, 2.7, f64::consts::PI]) .build();
assert_eq!(instance.data, vec![Some(1), None, Some(3)]);
assert_eq!(
instance.formatted,
vec![
"1.5".to_string(),
"2.7".to_string(),
f64::consts::PI.to_string()
]
);
assert!(instance.map.is_empty()); }
#[derive(TypeStateBuilder, Debug, PartialEq)]
#[builder(impl_into)] struct BooleanCombinations {
#[builder(required, impl_into = true)] field1: String,
#[builder(impl_into = false)] field2: String,
#[builder(skip_setter, default = "default".to_string())]
field3: String,
field4: String,
}
#[test]
fn test_boolean_combinations() {
let instance = BooleanCombinations::builder()
.field1("test1") .field2("test2".to_string()) .field4("test4".to_string()) .build();
assert_eq!(instance.field1, "test1");
assert_eq!(instance.field2, "test2");
assert_eq!(instance.field3, "default"); assert_eq!(instance.field4, "test4");
}
}
#[cfg(test)]
mod documentation_examples {
use super::*;
#[derive(TypeStateBuilder, Debug, PartialEq)]
#[builder(setter_prefix = "with_")]
struct UserProfile {
#[builder(required)]
username: String,
#[builder(required, impl_into = true)]
email: String,
#[builder(converter = |age_str: &str| age_str.parse::<u32>().unwrap_or(0))]
age: u32,
#[builder(default = vec![], converter = |interests: &[&str]| interests.iter().map(|s| s.to_string()).collect())]
interests: Vec<String>,
#[builder(skip_setter, default = 1234567890)]
created_at: u64,
#[builder(default = true)]
active: bool,
}
#[test]
fn test_user_profile_example() {
let instance = UserProfile::builder()
.with_username("alice".to_string())
.with_email("alice@example.com") .with_age("25") .with_interests(&["rust", "programming"]) .with_active(false)
.build();
assert_eq!(instance.username, "alice");
assert_eq!(instance.email, "alice@example.com");
assert_eq!(instance.age, 25);
assert_eq!(
instance.interests,
vec!["rust".to_string(), "programming".to_string()]
);
assert_eq!(instance.created_at, 1234567890); assert!(!instance.active);
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
#[builder(build_method = "finalize", impl_into)]
struct ServerConfig {
#[builder(required, setter_name = "host")]
hostname: String,
#[builder(required)]
port: u16,
#[builder(converter = |env: &str| matches!(env.to_lowercase().as_str(), "true" | "1" | "yes" | "on"))]
ssl_enabled: bool,
#[builder(converter = |paths: Vec<&str>| paths.into_iter().map(std::path::PathBuf::from).collect(), default = vec![])]
cert_paths: Vec<std::path::PathBuf>,
#[builder(default = 1)]
worker_threads: usize,
#[builder(skip_setter, default = String::from("server-v1.0"))]
version: String,
}
#[test]
fn test_server_config_example() {
let instance = ServerConfig::builder()
.host("localhost") .port(8080u16)
.ssl_enabled("true") .cert_paths(vec!["/etc/ssl/cert.pem", "/etc/ssl/key.pem"]) .worker_threads(4usize)
.finalize();
assert_eq!(instance.hostname, "localhost");
assert_eq!(instance.port, 8080);
assert!(instance.ssl_enabled);
assert_eq!(
instance.cert_paths,
vec![
std::path::PathBuf::from("/etc/ssl/cert.pem"),
std::path::PathBuf::from("/etc/ssl/key.pem")
]
);
assert_eq!(instance.worker_threads, 4);
assert_eq!(instance.version, "server-v1.0"); }
}