81 lines
2.4 KiB
Rust
81 lines
2.4 KiB
Rust
|
|
use roto::generator::generate_rust_code;
|
||
|
|
use roto::google::protobuf::compiler::plugin::CodeGeneratorRequest;
|
||
|
|
use roto::google::protobuf::descriptor::FileDescriptorSet;
|
||
|
|
use std::fs;
|
||
|
|
|
||
|
|
fn load_generated_code() -> String {
|
||
|
|
let data = fs::read("data/request.bin").expect("Failed to read data/request.bin");
|
||
|
|
let request = CodeGeneratorRequest::new(&data).expect("Failed to parse CodeGeneratorRequest");
|
||
|
|
|
||
|
|
let mut set_buf = Vec::new();
|
||
|
|
for file_res in request.proto_file() {
|
||
|
|
let (file_data, _) = file_res.expect("Failed to iterate proto_file");
|
||
|
|
set_buf.push(10u8);
|
||
|
|
let len = file_data.len() as u64;
|
||
|
|
let mut len_buf = [0u8; 10];
|
||
|
|
let len_size = roto::write_varint(len, &mut len_buf).unwrap();
|
||
|
|
set_buf.extend_from_slice(&len_buf[..len_size]);
|
||
|
|
set_buf.extend_from_slice(file_data);
|
||
|
|
}
|
||
|
|
let set = FileDescriptorSet::new(&set_buf).expect("Failed to create FileDescriptorSet");
|
||
|
|
|
||
|
|
generate_rust_code(&set, None, false)
|
||
|
|
.into_iter()
|
||
|
|
.map(|(_, content)| content)
|
||
|
|
.collect()
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn test_builder_structs_have_written_flags() {
|
||
|
|
let code = load_generated_code();
|
||
|
|
assert!(
|
||
|
|
code.contains("_written: bool"),
|
||
|
|
"Builder structs should contain `_written: bool` fields for each proto field"
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn test_builder_constructor_initialises_written_flags_to_false() {
|
||
|
|
let code = load_generated_code();
|
||
|
|
assert!(
|
||
|
|
code.contains("_written: false"),
|
||
|
|
"Builder constructors should initialise every `_written` flag to false"
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn test_builder_setters_mark_field_as_written() {
|
||
|
|
let code = load_generated_code();
|
||
|
|
assert!(
|
||
|
|
code.contains("_written = true"),
|
||
|
|
"Each builder setter should set its `_written` flag to true"
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn test_builder_has_with_method() {
|
||
|
|
let code = load_generated_code();
|
||
|
|
assert!(
|
||
|
|
code.contains("pub fn with("),
|
||
|
|
"Each builder impl should expose a `with` method"
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn test_message_structs_have_raw_fields_method() {
|
||
|
|
let code = load_generated_code();
|
||
|
|
assert!(
|
||
|
|
code.contains("pub fn raw_fields("),
|
||
|
|
"Each message struct impl should expose a `raw_fields` method"
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn test_with_method_uses_write_raw() {
|
||
|
|
let code = load_generated_code();
|
||
|
|
assert!(
|
||
|
|
code.contains("write_raw(raw_bytes)"),
|
||
|
|
"The `with` method should call `write_raw` to copy field bytes"
|
||
|
|
);
|
||
|
|
}
|