use crate::patterns::form::FormState;
#[test]
fn test_form_state_new() {
let form = FormState::new().build();
assert!(form.field_names().is_empty());
assert!(form.focused().is_none());
assert!(!form.is_submitted());
}
#[test]
fn test_form_state_default() {
let form = FormState::default();
assert!(form.field_names().is_empty());
}
#[test]
fn test_form_state_builder_default() {
let builder = FormState::new();
let form = builder.build();
assert!(form.is_valid());
}
#[test]
fn test_form_state() {
let form = FormState::new()
.field("username", |f| f.required())
.field("email", |f| f.email())
.build();
form.set_value("username", "john");
form.set_value("email", "john@example.com");
assert!(form.is_valid());
}
#[test]
fn test_form_state_get() {
let form = FormState::new().field("name", |f| f.label("Name")).build();
let field = form.get("name");
assert!(field.is_some());
assert_eq!(field.unwrap().label, "Name");
}
#[test]
fn test_form_state_get_none() {
let form = FormState::new().build();
assert!(form.get("nonexistent").is_none());
}
#[test]
fn test_form_state_set_value() {
let form = FormState::new().field("name", |f| f).build();
form.set_value("name", "modified");
assert_eq!(form.value("name"), Some("modified".to_string()));
}
#[test]
fn test_form_state_value() {
let form = FormState::new().field("name", |f| f).build();
form.set_value("name", "test");
assert_eq!(form.value("name"), Some("test".to_string()));
}
#[test]
fn test_form_state_value_none() {
let form = FormState::new().build();
assert!(form.value("nonexistent").is_none());
}
#[test]
fn test_form_state_set_value_marks_touched() {
let form = FormState::new().field("name", |f| f).build();
form.set_value("name", "test");
assert!(form.get("name").unwrap().is_touched());
}
#[test]
fn test_form_state_set_value_nonexistent() {
let form = FormState::new().build();
form.set_value("nonexistent", "value"); }
#[test]
fn test_form_field_auto_validates() {
let form = FormState::new().field("name", |f| f.required()).build();
assert!(!form.is_valid());
form.set_value("name", "valid");
assert!(form.is_valid());
}
#[test]
fn test_form_errors() {
let form = FormState::new().field("username", |f| f.required()).build();
assert!(form.has_errors());
let errors = form.errors();
assert_eq!(errors.len(), 1);
}
#[test]
fn test_form_errors_multiple_fields() {
let form = FormState::new()
.field("a", |f| f.required())
.field("b", |f| f.required())
.build();
let errors = form.errors();
assert_eq!(errors.len(), 2);
}
#[test]
fn test_form_focus() {
let form = FormState::new()
.field("a", |f| f)
.field("b", |f| f)
.field("c", |f| f)
.build();
form.focus("a");
assert_eq!(form.focused(), Some("a".to_string()));
form.focus_next();
assert_eq!(form.focused(), Some("b".to_string()));
form.focus_next();
assert_eq!(form.focused(), Some("c".to_string()));
form.focus_next(); assert_eq!(form.focused(), Some("a".to_string()));
form.focus_prev();
assert_eq!(form.focused(), Some("c".to_string()));
}
#[test]
fn test_form_focus_nonexistent() {
let form = FormState::new().field("a", |f| f).build();
form.focus("nonexistent");
assert!(form.focused().is_none());
}
#[test]
fn test_form_focus_next_empty() {
let form = FormState::new().build();
form.focus_next(); assert!(form.focused().is_none());
}
#[test]
fn test_form_focus_prev_empty() {
let form = FormState::new().build();
form.focus_prev(); assert!(form.focused().is_none());
}
#[test]
fn test_form_focus_prev_wrap() {
let form = FormState::new().field("a", |f| f).field("b", |f| f).build();
form.focus("a");
form.focus_prev();
assert_eq!(form.focused(), Some("b".to_string()));
}
#[test]
fn test_form_blur() {
let form = FormState::new().field("a", |f| f).build();
form.focus("a");
assert!(form.focused().is_some());
form.blur();
assert!(form.focused().is_none());
}
#[test]
fn test_form_field_names() {
let form = FormState::new()
.field("first", |f| f)
.field("second", |f| f)
.build();
let names = form.field_names();
assert_eq!(names, &["first", "second"]);
}
#[test]
fn test_form_iter() {
let form = FormState::new()
.field("a", |f| f.label("A"))
.field("b", |f| f.label("B"))
.build();
let fields: Vec<_> = form.iter().collect();
assert_eq!(fields.len(), 2);
assert_eq!(fields[0].0, "a");
assert_eq!(fields[0].1.label, "A");
assert_eq!(fields[1].0, "b");
assert_eq!(fields[1].1.label, "B");
}
#[test]
fn test_form_values() {
let form = FormState::new().field("a", |f| f).field("b", |f| f).build();
form.set_value("a", "value_a");
form.set_value("b", "value_b");
let values = form.values();
assert_eq!(values.get("a"), Some(&"value_a".to_string()));
assert_eq!(values.get("b"), Some(&"value_b".to_string()));
}
#[test]
fn test_form_values_empty() {
let form = FormState::new().build();
let values = form.values();
assert!(values.is_empty());
}
#[test]
fn test_form_submit() {
let form = FormState::new().field("name", |f| f.required()).build();
assert!(!form.submit());
assert!(form.is_submitted());
form.set_value("name", "John");
assert!(form.submit());
}
#[test]
fn test_form_submit_touches_all_fields() {
let form = FormState::new().field("a", |f| f).field("b", |f| f).build();
assert!(!form.get("a").unwrap().is_touched());
assert!(!form.get("b").unwrap().is_touched());
form.submit();
assert!(form.get("a").unwrap().is_touched());
assert!(form.get("b").unwrap().is_touched());
}
#[test]
fn test_form_reset() {
let form = FormState::new().field("name", |f| f).build();
form.set_value("name", "John");
form.submit();
form.reset();
assert_eq!(form.value("name"), Some("".to_string()));
assert!(!form.is_submitted());
}
#[test]
fn test_form_reset_clears_touched() {
let form = FormState::new().field("name", |f| f).build();
form.set_value("name", "value");
assert!(form.get("name").unwrap().is_touched());
form.reset();
assert!(!form.get("name").unwrap().is_touched());
}
#[test]
fn test_form_reset_clears_errors() {
let form = FormState::new().field("name", |f| f.required()).build();
assert!(!form.get("name").unwrap().errors().is_empty());
form.set_value("name", "valid");
form.reset();
assert!(!form.get("name").unwrap().errors().is_empty());
}
#[test]
fn test_form_state_whitespace_only_required() {
let form = FormState::new().field("name", |f| f.required()).build();
form.set_value("name", " ");
assert!(!form.is_valid());
}
#[test]
fn test_form_state_whitespace_only_min_length() {
let form = FormState::new().field("name", |f| f.min_length(3)).build();
form.set_value("name", " "); assert!(!form.is_valid());
}
#[test]
fn test_form_state_empty_string_required() {
let form = FormState::new().field("name", |f| f.required()).build();
form.set_value("name", "");
assert!(!form.is_valid());
}
#[test]
fn test_form_state_trimming_whitespace() {
let form = FormState::new().field("name", |f| f.min_length(3)).build();
form.set_value("name", " abc "); assert!(form.is_valid());
}
#[test]
fn test_form_state_max_length_boundary() {
let form = FormState::new().field("name", |f| f.max_length(5)).build();
form.set_value("name", "12345");
assert!(form.is_valid());
form.set_value("name", "123456");
assert!(!form.is_valid());
}
#[test]
fn test_form_state_min_length_boundary() {
let form = FormState::new().field("name", |f| f.min_length(3)).build();
form.set_value("name", "12");
assert!(!form.is_valid());
form.set_value("name", "123");
assert!(form.is_valid());
}
#[test]
fn test_form_state_value_range_boundaries() {
let form = FormState::new()
.field("count", |f| f.number().min(1.0).max(10.0))
.build();
form.set_value("count", "0");
assert!(!form.is_valid());
form.set_value("count", "1");
assert!(form.is_valid());
form.set_value("count", "10");
assert!(form.is_valid());
form.set_value("count", "11");
assert!(!form.is_valid());
}
#[test]
fn test_form_state_unicode_emoji() {
let form = FormState::new().field("emoji", |f| f.min_length(1)).build();
form.set_value("emoji", "😀"); assert!(form.is_valid());
}
#[test]
fn test_form_state_unicode_combining_characters() {
let form = FormState::new()
.field("accented", |f| f.min_length(1))
.build();
form.set_value("accented", "é"); assert!(form.is_valid());
}
#[test]
fn test_form_state_special_characters_email() {
let form = FormState::new().field("email", |f| f.email()).build();
form.set_value("email", "user+test@example.com");
assert!(form.is_valid());
form.set_value("email", "userexample.com");
assert!(!form.is_valid());
form.set_value("email", "user@");
assert!(!form.is_valid());
}
#[test]
fn test_form_state_numeric_with_special_chars() {
let form = FormState::new().field("number", |f| f.number()).build();
form.set_value("number", "123");
assert!(form.is_valid());
form.set_value("number", "-123"); assert!(form.is_valid());
form.set_value("number", "12.5"); assert!(form.is_valid());
form.set_value("number", "12a3");
assert!(!form.is_valid());
form.set_value("number", "12$3");
assert!(!form.is_valid());
}
#[test]
fn test_form_state_multiple_fields_validation() {
let form = FormState::new()
.field("password", |f| f.min_length(8).label("Password"))
.field("confirm", |f| f.matches("password").label("Confirm"))
.build();
form.set_value("password", "secure123");
form.set_value("confirm", "secure123");
assert!(form.is_valid());
form.set_value("password", "secure123");
form.set_value("confirm", "different");
assert!(!form.is_valid());
}
#[test]
fn test_form_state_email_with_subdomain() {
let form = FormState::new().field("email", |f| f.email()).build();
form.set_value("email", "user@mail.example.com");
assert!(form.is_valid());
}
#[test]
fn test_form_state_email_with_hyphenated_local() {
let form = FormState::new().field("email", |f| f.email()).build();
form.set_value("email", "user-name@example.com");
assert!(form.is_valid());
}