|
|
|
// 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
|
|
|
|
|
|
|
|
//! Tests covering accessors for singular bool, int32, int64, and bytes fields.
|
|
|
|
|
|
|
|
use googletest::prelude::*;
|
|
|
|
use protobuf::proto;
|
|
|
|
use unittest_rust_proto::{
|
|
|
|
test_all_types::{self, NestedMessage},
|
|
|
|
NestedTestAllTypes, TestAllTypes,
|
|
|
|
};
|
|
|
|
|
|
|
|
struct TestValue {
|
|
|
|
val: i64,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_setting_literals() {
|
|
|
|
let fixed64 = || 108;
|
|
|
|
let test_ref = |x: &i64| *x;
|
|
|
|
let test_ref_b = |x: &u32| *x;
|
|
|
|
let one_oh_seven = [107_u32];
|
|
|
|
let value = TestValue { val: 106 };
|
|
|
|
|
|
|
|
let msg = proto!(TestAllTypes {
|
|
|
|
optional_int32: 101,
|
|
|
|
optional_int64: 102,
|
|
|
|
optional_uint32: 103,
|
|
|
|
optional_uint64: if true { 104 } else { 99 },
|
|
|
|
optional_sint32: -105,
|
|
|
|
optional_sint64: (test_ref(&value.val)),
|
|
|
|
optional_fixed32: { test_ref_b(&one_oh_seven[0]) },
|
|
|
|
optional_fixed64: fixed64(), //108
|
|
|
|
optional_sfixed32: 100 + 9,
|
|
|
|
optional_sfixed64: {
|
|
|
|
let x = 10;
|
|
|
|
100 + x
|
|
|
|
},
|
|
|
|
optional_nested_message: NestedMessage { bb: 42 },
|
|
|
|
optional_float: 111.5,
|
|
|
|
optional_double: 112000.5,
|
|
|
|
optional_bool: true,
|
|
|
|
optional_string: "foo",
|
|
|
|
optional_bytes: b"bar",
|
|
|
|
optional_nested_enum: test_all_types::NestedEnum::Baz,
|
|
|
|
});
|
|
|
|
|
|
|
|
assert_that!(msg.optional_int32(), eq(101));
|
|
|
|
assert_that!(msg.optional_int64(), eq(102));
|
|
|
|
assert_that!(msg.optional_uint32(), eq(103));
|
|
|
|
assert_that!(msg.optional_uint64(), eq(104));
|
|
|
|
assert_that!(msg.optional_sint32(), eq(-105));
|
|
|
|
assert_that!(msg.optional_sint64(), eq(106));
|
|
|
|
assert_that!(msg.optional_fixed32(), eq(107));
|
|
|
|
assert_that!(msg.optional_fixed64(), eq(108));
|
|
|
|
assert_that!(msg.optional_sfixed32(), eq(109));
|
|
|
|
assert_that!(msg.optional_sfixed64(), eq(110));
|
|
|
|
assert_that!(msg.optional_float(), eq(111.5));
|
|
|
|
assert_that!(msg.optional_double(), eq(112000.5));
|
|
|
|
assert_that!(msg.optional_bool(), eq(true));
|
|
|
|
assert_that!(msg.optional_string(), eq("foo"));
|
|
|
|
assert_that!(msg.optional_bytes(), eq(b"bar"));
|
|
|
|
assert_that!(msg.optional_nested_enum(), eq(test_all_types::NestedEnum::Baz));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn single_nested_message() {
|
|
|
|
let msg = proto!(TestAllTypes { optional_nested_message: NestedMessage { bb: 42 } });
|
|
|
|
assert_that!(msg.optional_nested_message().bb(), eq(42));
|
|
|
|
|
|
|
|
// field above it
|
|
|
|
let msg = proto!(TestAllTypes {
|
|
|
|
optional_int32: 1,
|
|
|
|
optional_nested_message: NestedMessage { bb: 42 }
|
|
|
|
});
|
|
|
|
assert_that!(msg.optional_nested_message().bb(), eq(42));
|
|
|
|
|
|
|
|
// field below it
|
|
|
|
let msg = proto!(TestAllTypes {
|
|
|
|
optional_nested_message: NestedMessage { bb: 42 },
|
|
|
|
optional_int32: 1
|
|
|
|
});
|
|
|
|
assert_that!(msg.optional_nested_message().bb(), eq(42));
|
|
|
|
|
|
|
|
// field above and below it
|
|
|
|
let msg = proto!(TestAllTypes {
|
|
|
|
optional_int32: 1,
|
|
|
|
optional_nested_message: NestedMessage { bb: 42 },
|
|
|
|
optional_int64: 2
|
|
|
|
});
|
|
|
|
assert_that!(msg.optional_nested_message().bb(), eq(42));
|
|
|
|
|
|
|
|
// test empty initializer
|
|
|
|
let msg = proto!(TestAllTypes {});
|
|
|
|
assert_that!(msg.has_optional_nested_message(), eq(false));
|
|
|
|
|
|
|
|
// empty nested message should be present
|
|
|
|
// make sure that qualified path names work
|
|
|
|
let msg = proto!(::unittest_rust_proto::TestAllTypes {
|
|
|
|
optional_nested_message: unittest_rust_proto::test_all_types::NestedMessage {}
|
|
|
|
});
|
|
|
|
assert_that!(msg.has_optional_nested_message(), eq(true));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_recursive_msg() {
|
|
|
|
let msg = proto!(NestedTestAllTypes {
|
|
|
|
child: NestedTestAllTypes {
|
|
|
|
payload: TestAllTypes { optional_int32: 41 },
|
|
|
|
child: NestedTestAllTypes {
|
|
|
|
child: NestedTestAllTypes { payload: TestAllTypes { optional_int32: 43 } },
|
|
|
|
payload: TestAllTypes { optional_int32: 42 }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
assert_that!(msg.child().payload().optional_int32(), eq(41));
|
|
|
|
assert_that!(msg.child().child().payload().optional_int32(), eq(42));
|
|
|
|
assert_that!(msg.child().child().child().payload().optional_int32(), eq(43));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_spread_msg() {
|
|
|
|
let msg = proto!(TestAllTypes { optional_nested_message: NestedMessage { bb: 42 } });
|
|
|
|
let msg2 = proto!(TestAllTypes { ..msg.as_view() });
|
|
|
|
assert_that!(msg2.optional_nested_message().bb(), eq(42));
|
|
|
|
let msg3 = proto!(TestAllTypes { optional_int32: 1, ..msg.as_view() });
|
|
|
|
assert_that!(msg3.optional_nested_message().bb(), eq(42));
|
|
|
|
assert_that!(msg3.optional_int32(), eq(1));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_spread_nested_msg() {
|
|
|
|
let msg = proto!(NestedTestAllTypes {
|
|
|
|
child: NestedTestAllTypes {
|
|
|
|
payload: TestAllTypes { optional_int32: 41 },
|
|
|
|
child: NestedTestAllTypes {
|
|
|
|
child: NestedTestAllTypes { payload: TestAllTypes { optional_int32: 43 } },
|
|
|
|
payload: TestAllTypes { optional_int32: 42 }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
let msg2 = proto!(NestedTestAllTypes {
|
|
|
|
child: NestedTestAllTypes { payload: TestAllTypes { optional_int32: 100 }, ..msg.child() }
|
|
|
|
});
|
|
|
|
assert_that!(msg2.child().payload().optional_int32(), eq(100));
|
|
|
|
assert_that!(msg2.child().child().payload().optional_int32(), eq(42));
|
|
|
|
assert_that!(msg2.child().child().child().payload().optional_int32(), eq(43));
|
|
|
|
}
|