103 lines
3.4 KiB
Rust
103 lines
3.4 KiB
Rust
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"));
|
|
}
|
|
}
|