use super::{Directory, fixture}; use dever::{ compiler::{build, project::Project}, syntax::source::Source, }; #[test] fn native_uuid_values_and_maps_use_only_the_uuid_feature() { let directory = Directory::new(); let project = Project::load(&fixture().with_file_name("uuid.dever")).unwrap(); let program = project.check().unwrap(); let main = program .functions .iter() .position(|function| function.signature.name == "verify") .unwrap(); assert_eq!( build::runtime_features(&program, &program.reachable([main])), ["uuid"] ); let binary = build::build( &program, &project.sources, "verify", &directory.0.join("verify"), ) .unwrap(); let result = std::process::Command::new(binary).output().unwrap(); assert!( result.status.success(), "{}", String::from_utf8_lossy(&result.stderr) ); assert_eq!(result.stdout, b"true\n"); } #[test] fn infallible_batches_preserve_nullable_values_and_pending_task_cleanup() { let directory = Directory::new(); let project = Project::load(&fixture().with_file_name("uuid.dever")).unwrap(); let program = project.check().unwrap(); for entry in ["batchVerify", "taskVerify"] { let binary = build::build(&program, &project.sources, entry, &directory.0.join(entry)).unwrap(); let result = std::process::Command::new(binary).output().unwrap(); assert!( result.status.success(), "{entry}: {}", String::from_utf8_lossy(&result.stderr) ); assert_eq!(result.stdout, b"true\n"); } } #[test] fn uuid_command_fields_normalize_and_reject_noncanonical_input() { let directory = Directory::new(); let mut project = Project::load(&fixture().with_file_name("application")).unwrap(); let source = project .sources .iter_mut() .find(|source| source.path.ends_with("greeting/app.dever")) .unwrap(); let text = source.text.replace("id: Id", "id: Uuid"); *source = Source::new(source.id, source.path.clone(), text); let program = project.check().unwrap(); let binary = build::build( &program, &project.sources, "main", &directory.0.join("commands"), ) .unwrap(); let input = r#"{"value":{"id":"550E8400-E29B-41D4-A716-446655440000","name":"雪","scores":[]}}"#; let result = std::process::Command::new(&binary) .args(["demo.greeting.echo", input]) .output() .unwrap(); assert!( result.status.success(), "{}", String::from_utf8_lossy(&result.stderr) ); assert_eq!( String::from_utf8(result.stdout).unwrap(), "{\"code\":0,\"message\":\"ok\",\"data\":{\"id\":\"550e8400-e29b-41d4-a716-446655440000\",\"name\":\"雪\",\"scores\":[],\"ratio\":null}}\n" ); for value in [ "550e8400e29b41d4a716446655440000", "00000000-0000-0000-0000-00000000000-", ] { let input = input.replace("550E8400-E29B-41D4-A716-446655440000", value); let result = std::process::Command::new(&binary) .args(["demo.greeting.echo", &input]) .output() .unwrap(); assert!(!result.status.success()); assert!(result.stdout.is_empty()); assert!(String::from_utf8_lossy(&result.stderr).contains("invalid command input")); } }