[Rust] Shared String (#6367)

* Adds shared strings and tests for shared strings

* Adds resets on string_map

* Moved shared strings to use vector instead of hashmap

* Addresses all the issues

* Resolves some comments
This commit is contained in:
mustiikhalil
2021-01-04 17:18:35 +03:00
committed by GitHub
parent 44cf2bde19
commit 57f68e2896
3 changed files with 92 additions and 0 deletions

View File

@@ -3051,4 +3051,51 @@ fn load_file(filename: &str) -> Result<Vec<u8>, std::io::Error> {
f.read_to_end(&mut buf)?;
Ok(buf)
}
#[test]
fn test_shared_strings() {
let mut builder = flatbuffers::FlatBufferBuilder::new();
let offset1 = builder.create_shared_string("welcome to flatbuffers!!");
let offset2 = builder.create_shared_string("welcome");
let offset3 = builder.create_shared_string("welcome to flatbuffers!!");
assert_ne!(offset2.value(), offset3.value());
assert_eq!(offset1.value(), offset3.value());
builder.reset();
let offset4 = builder.create_shared_string("welcome");
let offset5 = builder.create_shared_string("welcome to flatbuffers!!");
assert_ne!(offset2.value(), offset4.value());
assert_ne!(offset5.value(), offset1.value());
builder.reset();
// Checks if the shared string function would always work with
// an object in between the writes
let name = builder.create_shared_string("foo");
let enemy = my_game::example::Monster::create(&mut builder, &my_game::example::MonsterArgs {
name: Some(name),
..Default::default()
});
let secondary_name = builder.create_shared_string("foo");
assert_eq!(name.value(), secondary_name.value());
// Builds a new monster object and embeds enemy into it so we can verify
// that shared strings are working.
let args = my_game::example::MonsterArgs {
name: Some(secondary_name),
enemy: Some(enemy),
testarrayofstring: Some(builder.create_vector(&[name, secondary_name])),
..Default::default()
};
// Building secondary monster
let main_monster = my_game::example::Monster::create(&mut builder, &args);
builder.finish(main_monster, None);
let monster = my_game::example::root_as_monster(builder.finished_data()).unwrap();
// Checks if the embedded object (Enemy) name is foo
assert_eq!(monster.enemy().unwrap().name(), "foo");
let string_vector = monster.testarrayofstring().unwrap();
// Check if the vector will have the same string
assert_eq!(string_vector.get(0), "foo");
assert_eq!(string_vector.get(1), "foo");
}
}