aura-gui 0.2.2

UI nativa acelerada por GPU para escritorio, Android e iOS, en un solo crate: estilo tipo Tailwind, componentes, sombras, animaciones y agentes de IA. Reposo a cero. Licencia AGPL-3.0 o comercial.
use super::*;
use crate::core::FocusState;

#[test]
fn embedded_input_remains_editable_and_keeps_undo() {
    let mut field = input("ls").embedded();
    assert!(field.plain);
    assert!(!field.read_only);
    assert!(!field.compact);
    field.insert(" -l");
    assert_eq!(field.text(), "ls -l");
    field.undo();
    assert_eq!(field.text(), "ls");
}

fn input(text: &str) -> TextInput {
    let mut input = TextInput::new(FocusState::default().new_handle());
    input.set_text(text);
    input
}

#[test]
fn inserting_replaces_the_selection() {
    let mut field = input("hola mundo");
    field.move_word(false, true);
    field.insert("aura");
    assert_eq!(field.text(), "hola aura");
}

#[test]
fn backspace_respects_multibyte_characters() {
    let mut field = input("añ");
    field.backspace(false);
    assert_eq!(field.text(), "a");
}

#[test]
fn word_deletion_and_undo() {
    let mut field = input("fn main_loop");
    field.backspace(true);
    assert_eq!(field.text(), "fn ");
    field.undo();
    assert_eq!(field.text(), "fn main_loop");
    field.redo();
    assert_eq!(field.text(), "fn ");
}

#[test]
fn newlines_are_not_inserted() {
    let mut field = input("");
    field.insert("uno\ndos");
    assert_eq!(field.text(), "unodos");
}

#[test]
fn double_click_selects_a_word() {
    let mut field = input("abrir archivo");
    field.click(8, false, 2);
    assert_eq!(field.selected_text(), "archivo");
}

#[test]
fn un_campo_enmascarado_no_entrega_su_seleccion() {
    let mut entities = crate::core::EntityMap::new();
    let mut field = TextInput::new(entities.focus.new_handle());
    field.set_text("sk-secreta");
    field.select_all();
    assert_eq!(field.selected_text(), "sk-secreta");
    field.set_masked(true);
    assert_eq!(field.selected_text(), "", "no se puede copiar un secreto");
    assert_eq!(field.text(), "sk-secreta", "el valor real sigue disponible para quien lo lee");
}

#[test]
fn select_range_respeta_los_limites_de_caracter() {
    let mut input = input("año.txt");
    input.select_range(0..4);
    assert_eq!(input.selection(), 0..4, "«año» ocupa 4 bytes");
    input.select_range(0..2);
    assert_eq!(input.selection(), 0..1, "a mitad de «ñ» retrocede al límite");
    input.select_range(3..99);
    assert_eq!(input.selection(), 3..input.text().len());
}