|
6 | 6 | // https://developers.google.com/open-source/licenses/bsd
|
7 | 7 |
|
8 | 8 | use googletest::prelude::*;
|
9 |
| -use map_unittest_proto::TestMap; |
| 9 | +use map_unittest_proto::{TestMap, TestMapWithMessages}; |
10 | 10 | use paste::paste;
|
11 | 11 | use std::collections::HashMap;
|
| 12 | +use unittest_proto::TestAllTypes; |
12 | 13 |
|
13 | 14 | macro_rules! generate_map_primitives_tests {
|
14 | 15 | (
|
@@ -145,3 +146,153 @@ fn test_bytes_and_string_copied() {
|
145 | 146 | );
|
146 | 147 | assert_that!(msg.map_int32_bytes_mut().get(1).unwrap(), eq(b"world"));
|
147 | 148 | }
|
| 149 | + |
| 150 | +macro_rules! generate_map_with_msg_values_tests { |
| 151 | + ( |
| 152 | + $(($k_field:ident, $k_nonzero:expr, $k_other:expr $(,)?)),* |
| 153 | + $(,)? |
| 154 | + ) => { |
| 155 | + paste! { $( |
| 156 | + #[test] |
| 157 | + fn [< test_map_ $k_field _all_types >]() { |
| 158 | + // We need to cover the following upb/c++ thunks: |
| 159 | + // TODO - b/323883851: Add test once Map::new is public. |
| 160 | + // * new |
| 161 | + // * free (covered implicitly by drop) |
| 162 | + // * clear, size, insert, get, remove, iter, iter_next (all covered below) |
| 163 | + let mut msg = TestMapWithMessages::new(); |
| 164 | + assert_that!(msg.[< map_ $k_field _all_types >]().len(), eq(0)); |
| 165 | + assert_that!(msg.[< map_ $k_field _all_types >]().get($k_nonzero), none()); |
| 166 | + // this block makes sure `insert` copies/moves, not borrows. |
| 167 | + { |
| 168 | + let mut msg_val = TestAllTypes::new(); |
| 169 | + msg_val.optional_int32_mut().set(1001); |
| 170 | + assert_that!( |
| 171 | + msg |
| 172 | + .[< map_ $k_field _all_types_mut >]() |
| 173 | + .insert($k_nonzero, msg_val.as_view()), |
| 174 | + eq(true), |
| 175 | + "`insert` should return true when key was inserted." |
| 176 | + ); |
| 177 | + assert_that!( |
| 178 | + msg |
| 179 | + .[< map_ $k_field _all_types_mut >]() |
| 180 | + .insert($k_nonzero, msg_val.as_view()), |
| 181 | + eq(false), |
| 182 | + "`insert` should return false when key was already present." |
| 183 | + |
| 184 | + ); |
| 185 | + } |
| 186 | + |
| 187 | + assert_that!( |
| 188 | + msg.[< map_ $k_field _all_types >]().len(), |
| 189 | + eq(1), |
| 190 | + "`size` thunk should return correct len."); |
| 191 | + |
| 192 | + assert_that!( |
| 193 | + msg.[< map_ $k_field _all_types >]().get($k_nonzero), |
| 194 | + some(anything()), |
| 195 | + "`get` should return Some when key present."); |
| 196 | + assert_that!( |
| 197 | + msg.[< map_ $k_field _all_types >]().get($k_nonzero).unwrap().optional_int32(), |
| 198 | + eq(1001)); |
| 199 | + assert_that!( |
| 200 | + msg.[< map_ $k_field _all_types >]().get($k_other), |
| 201 | + none(), |
| 202 | + "`get` should return None when key missing."); |
| 203 | + |
| 204 | + msg.[< map_ $k_field _all_types_mut >]().clear(); |
| 205 | + assert_that!( |
| 206 | + msg.[< map_ $k_field _all_types >]().len(), |
| 207 | + eq(0), |
| 208 | + "`clear` should drop all elements."); |
| 209 | + |
| 210 | + |
| 211 | + assert_that!( |
| 212 | + msg.[< map_ $k_field _all_types_mut >]().insert($k_nonzero, TestAllTypes::new().as_view()), |
| 213 | + eq(true)); |
| 214 | + assert_that!( |
| 215 | + msg.[< map_ $k_field _all_types_mut >]().remove($k_nonzero), |
| 216 | + eq(true), |
| 217 | + "`remove` should return true when key was present."); |
| 218 | + assert_that!(msg.[< map_ $k_field _all_types >]().len(), eq(0)); |
| 219 | + assert_that!( |
| 220 | + msg.[< map_ $k_field _all_types_mut >]().remove($k_nonzero), |
| 221 | + eq(false), |
| 222 | + "`remove` should return false when key was missing."); |
| 223 | + |
| 224 | + // empty iter |
| 225 | + // assert_that!( |
| 226 | + // msg.[< map_ $k_field _all_types_mut >]().iter().collect::<Vec<_>>(), |
| 227 | + // elements_are![], |
| 228 | + // "`iter` should work when empty." |
| 229 | + // ); |
| 230 | + assert_that!( |
| 231 | + msg.[< map_ $k_field _all_types_mut >]().keys().collect::<Vec<_>>(), |
| 232 | + elements_are![], |
| 233 | + "`iter` should work when empty." |
| 234 | + ); |
| 235 | + assert_that!( |
| 236 | + msg.[< map_ $k_field _all_types_mut >]().values().collect::<Vec<_>>(), |
| 237 | + elements_are![], |
| 238 | + "`iter` should work when empty." |
| 239 | + ); |
| 240 | + |
| 241 | + // single element iter |
| 242 | + assert_that!( |
| 243 | + msg.[< map_ $k_field _all_types_mut >]().insert($k_nonzero, TestAllTypes::new().as_view()), |
| 244 | + eq(true)); |
| 245 | + // assert_that!( |
| 246 | + // msg.[< map_ $k_field _all_types >]().iter().collect::<Vec<_>>(), |
| 247 | + // unordered_elements_are![ |
| 248 | + // eq(($k_nonzero, anything())), |
| 249 | + // ] |
| 250 | + // ); |
| 251 | + assert_that!( |
| 252 | + msg.[< map_ $k_field _all_types >]().keys().collect::<Vec<_>>(), |
| 253 | + unordered_elements_are![eq($k_nonzero)] |
| 254 | + ); |
| 255 | + assert_that!( |
| 256 | + msg.[< map_ $k_field _all_types >]().values().collect::<Vec<_>>().len(), |
| 257 | + eq(1)); |
| 258 | + |
| 259 | + |
| 260 | + // 2 element iter |
| 261 | + assert_that!( |
| 262 | + msg |
| 263 | + .[< map_ $k_field _all_types_mut >]() |
| 264 | + .insert($k_other, TestAllTypes::new().as_view()), |
| 265 | + eq(true)); |
| 266 | + |
| 267 | + assert_that!( |
| 268 | + msg.[< map_ $k_field _all_types >]().iter().collect::<Vec<_>>().len(), |
| 269 | + eq(2) |
| 270 | + ); |
| 271 | + assert_that!( |
| 272 | + msg.[< map_ $k_field _all_types >]().keys().collect::<Vec<_>>(), |
| 273 | + unordered_elements_are![eq($k_nonzero), eq($k_other)] |
| 274 | + ); |
| 275 | + assert_that!( |
| 276 | + msg.[< map_ $k_field _all_types >]().values().collect::<Vec<_>>().len(), |
| 277 | + eq(2) |
| 278 | + ); |
| 279 | + } |
| 280 | + )* } |
| 281 | + } |
| 282 | +} |
| 283 | + |
| 284 | +generate_map_with_msg_values_tests!( |
| 285 | + (int32, 1i32, 2i32), |
| 286 | + (int64, 1i64, 2i64), |
| 287 | + (uint32, 1u32, 2u32), |
| 288 | + (uint64, 1u64, 2u64), |
| 289 | + (sint32, 1, 2), |
| 290 | + (sint64, 1, 2), |
| 291 | + (fixed32, 1u32, 2u32), |
| 292 | + (fixed64, 1u64, 2u64), |
| 293 | + (sfixed32, 1, 2), |
| 294 | + (sfixed64, 1, 2), |
| 295 | + // TODO - b/324468833: fix msan failure |
| 296 | + // (bool, true, false), |
| 297 | + (string, "foo", "bar"), |
| 298 | +); |
0 commit comments