Protocol Buffers - Google's data interchange format (grpc依赖)
https://developers.google.com/protocol-buffers/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
5.4 KiB
163 lines
5.4 KiB
// Protocol Buffers - Google's data interchange format |
|
// Copyright 2023 Google LLC. All rights reserved. |
|
// |
|
// Use of this source code is governed by a BSD-style |
|
// license that can be found in the LICENSE file or at |
|
// https://developers.google.com/open-source/licenses/bsd |
|
|
|
use googletest::prelude::*; |
|
use paste::paste; |
|
use unittest_proto::proto2_unittest::{TestAllTypes, TestAllTypes_}; |
|
|
|
macro_rules! generate_repeated_numeric_test { |
|
($(($t: ty, $field: ident)),*) => { |
|
paste! { $( |
|
#[test] |
|
fn [< test_repeated_ $field _accessors >]() { |
|
let mut msg = TestAllTypes::new(); |
|
assert_that!(msg.[< repeated_ $field >]().len(), eq(0)); |
|
assert_that!(msg.[<repeated_ $field >]().get(0), none()); |
|
|
|
let mut mutator = msg.[<repeated_ $field _mut >](); |
|
mutator.push(1 as $t); |
|
assert_that!(mutator.len(), eq(1)); |
|
assert_that!(mutator.iter().len(), eq(1)); |
|
assert_that!(mutator.get(0), some(eq(1 as $t))); |
|
mutator.set(0, 2 as $t); |
|
assert_that!(mutator.get(0), some(eq(2 as $t))); |
|
mutator.push(1 as $t); |
|
|
|
mutator.push(3 as $t); |
|
mutator.set(2, 4 as $t); |
|
assert_that!(mutator.get(2), some(eq(4 as $t))); |
|
mutator.set(2, 0 as $t); |
|
|
|
assert_that!( |
|
mutator.iter().collect::<Vec<_>>(), |
|
elements_are![eq(2 as $t), eq(1 as $t), eq(0 as $t)] |
|
); |
|
assert_that!( |
|
(*mutator).into_iter().collect::<Vec<_>>(), |
|
elements_are![eq(2 as $t), eq(1 as $t), eq(0 as $t)] |
|
); |
|
|
|
for i in 0..mutator.len() { |
|
mutator.set(i, 0 as $t); |
|
} |
|
assert_that!( |
|
msg.[<repeated_ $field _mut >]().iter().collect::<Vec<_>>(), |
|
each(eq(0 as $t)) |
|
); |
|
} |
|
|
|
#[test] |
|
fn [< test_repeated_ $field _set >]() { |
|
let mut msg = TestAllTypes::new(); |
|
let mut mutator = msg.[<repeated_ $field _mut>](); |
|
let mut msg2 = TestAllTypes::new(); |
|
let mut mutator2 = msg2.[<repeated_ $field _mut>](); |
|
for i in 0..5 { |
|
mutator2.push(i as $t); |
|
} |
|
protobuf::MutProxy::set(&mut mutator, *mutator2); |
|
|
|
assert_that!( |
|
mutator.iter().collect::<Vec<_>>(), |
|
eq(mutator2.iter().collect::<Vec<_>>()) |
|
); |
|
} |
|
)* } |
|
}; |
|
} |
|
|
|
generate_repeated_numeric_test!( |
|
(i32, int32), |
|
(u32, uint32), |
|
(i64, int64), |
|
(u64, uint64), |
|
(f32, float), |
|
(f64, double) |
|
); |
|
|
|
#[test] |
|
fn test_repeated_bool_accessors() { |
|
let mut msg = TestAllTypes::new(); |
|
assert_that!(msg.repeated_bool().len(), eq(0)); |
|
assert_that!(msg.repeated_bool().get(0), none()); |
|
|
|
let mut mutator = msg.repeated_bool_mut(); |
|
mutator.push(true); |
|
assert_that!(mutator.len(), eq(1)); |
|
assert_that!(mutator.get(0), some(eq(true))); |
|
mutator.set(0, false); |
|
assert_that!(mutator.get(0), some(eq(false))); |
|
mutator.push(true); |
|
|
|
mutator.push(false); |
|
mutator.set(2, true); |
|
assert_that!(mutator.get(2), some(eq(true))); |
|
mutator.set(2, false); |
|
assert_that!(mutator.get(2), some(eq(false))); |
|
|
|
assert_that!(mutator.iter().collect::<Vec<_>>(), elements_are![eq(false), eq(true), eq(false)]); |
|
assert_that!( |
|
(*mutator).into_iter().collect::<Vec<_>>(), |
|
elements_are![eq(false), eq(true), eq(false)] |
|
); |
|
|
|
for i in 0..mutator.len() { |
|
mutator.set(i, false); |
|
} |
|
assert_that!(msg.repeated_bool().iter().collect::<Vec<_>>(), each(eq(false))); |
|
} |
|
|
|
#[test] |
|
fn test_repeated_enum_accessors() { |
|
use TestAllTypes_::NestedEnum; |
|
|
|
let mut msg = TestAllTypes::new(); |
|
assert_that!(msg.repeated_nested_enum().len(), eq(0)); |
|
assert_that!(msg.repeated_nested_enum().get(0), none()); |
|
|
|
let mut mutator = msg.repeated_nested_enum_mut(); |
|
mutator.push(NestedEnum::Foo); |
|
assert_that!(mutator.len(), eq(1)); |
|
assert_that!(mutator.get(0), some(eq(NestedEnum::Foo))); |
|
mutator.set(0, NestedEnum::Bar); |
|
assert_that!(mutator.get(0), some(eq(NestedEnum::Bar))); |
|
mutator.push(NestedEnum::Baz); |
|
|
|
mutator.push(NestedEnum::Foo); |
|
mutator.set(2, NestedEnum::Neg); |
|
assert_that!(mutator.get(2), some(eq(NestedEnum::Neg))); |
|
mutator.set(2, NestedEnum::Foo); |
|
assert_that!(mutator.get(2), some(eq(NestedEnum::Foo))); |
|
|
|
assert_that!( |
|
mutator.iter().collect::<Vec<_>>(), |
|
elements_are![eq(NestedEnum::Bar), eq(NestedEnum::Baz), eq(NestedEnum::Foo)] |
|
); |
|
assert_that!( |
|
(*mutator).into_iter().collect::<Vec<_>>(), |
|
elements_are![eq(NestedEnum::Bar), eq(NestedEnum::Baz), eq(NestedEnum::Foo)] |
|
); |
|
|
|
for i in 0..mutator.len() { |
|
mutator.set(i, NestedEnum::Foo); |
|
} |
|
assert_that!(msg.repeated_nested_enum().iter().collect::<Vec<_>>(), each(eq(NestedEnum::Foo))); |
|
} |
|
|
|
#[test] |
|
fn test_repeated_bool_set() { |
|
let mut msg = TestAllTypes::new(); |
|
let mut mutator = msg.repeated_bool_mut(); |
|
let mut msg2 = TestAllTypes::new(); |
|
let mut mutator2 = msg2.repeated_bool_mut(); |
|
for _ in 0..5 { |
|
mutator2.push(true); |
|
} |
|
protobuf::MutProxy::set(&mut mutator, *mutator2); |
|
|
|
assert_that!(mutator.iter().collect::<Vec<_>>(), eq(mutator2.iter().collect::<Vec<_>>())); |
|
}
|
|
|