blob: 7a43ca86728da714e004ff7e403a07b1f38bdd68 [file] [log] [blame]
Jens Geyeraffea7b2020-05-22 17:28:30 +02001// Licensed to the Apache Software Foundation(ASF) under one
2// or more contributor license agreements.See the NOTICE file
3// distributed with this work for additional information
4// regarding copyright ownership.The ASF licenses this file
5// to you under the Apache License, Version 2.0 (the
6// "License"); you may not use this file except in compliance
7// with the License. You may obtain a copy of the License at
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing,
12// software distributed under the License is distributed on an
13// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14// KIND, either express or implied. See the License for the
15// specific language governing permissions and limitations
16// under the License.
17
18using System;
19using System.Collections.Generic;
20using System.Diagnostics;
21using System.Linq;
22using System.Text;
23using Microsoft.VisualStudio.TestTools.UnitTesting;
24using OptReqDefTest;
25using Thrift.Collections;
26
27namespace Thrift.Tests.DataModel
28{
29 // ReSharper disable once InconsistentNaming
30 [TestClass]
31 public class DeepCopyTests
32 {
33 [TestMethod]
34 public void Test_Complex_DeepCopy()
35 {
36 var first = InitializeInstance(new RaceDetails());
37 VerifyIdenticalContent(first, InitializeInstance(new RaceDetails()));
38
39 var second = first.DeepCopy();
40 VerifyIdenticalContent(first, second);
41 ModifyInstance(second,0);
42 VerifyDifferentContent(first, second);
43 VerifyIdenticalContent(first, InitializeInstance(new RaceDetails()));
44
45 var third = second.DeepCopy();
46 VerifyIdenticalContent(second, third);
47 ModifyInstance(third,0);
48 VerifyDifferentContent(second, third);
49 VerifyIdenticalContent(first, InitializeInstance(new RaceDetails()));
50 }
51
Jens Geyer3cac3202022-01-31 18:04:35 +010052 private RaceDetails? MakeNestedRaceDetails(int nesting)
Jens Geyeraffea7b2020-05-22 17:28:30 +020053 {
54 if (++nesting > 1)
55 return null;
56
57 var instance = new RaceDetails();
58 InitializeInstance(instance,nesting);
59 return instance;
60 }
61
Jens Geyer4115e952023-11-21 23:00:01 +010062 private jack.nested_struct? MakeNestedUnion(int nesting)
Jens Geyeraffea7b2020-05-22 17:28:30 +020063 {
64 if (++nesting > 1)
65 return null;
66
67 var details = new RaceDetails();
68 InitializeInstance(details,nesting);
69 return new jack.nested_struct(details);
70 }
71
72
73 private RaceDetails InitializeInstance(RaceDetails instance, int nesting = 0)
74 {
75 // at init, we intentionally leave all non-required fields unset
76 Assert.IsFalse(instance.__isset.opt_one);
77 Assert.IsFalse(instance.__isset.opt_two);
78 Assert.IsFalse(instance.__isset.opt_three);
79 Assert.IsFalse(instance.__isset.opt_four);
80 Assert.IsFalse(instance.__isset.opt_five);
81 Assert.IsFalse(instance.__isset.opt_six);
82 Assert.IsFalse(instance.__isset.opt_seven);
83 Assert.IsFalse(instance.__isset.opt_eight);
Jens Geyer62445c12022-06-29 00:00:00 +020084 Assert.IsFalse(instance.__isset.opt_nine);
Jens Geyeraffea7b2020-05-22 17:28:30 +020085
86 // set all required to null/default
87 instance.Req_one = default;
88 instance.Req_two = default;
89 instance.Req_three = default;
Jens Geyer3cac3202022-01-31 18:04:35 +010090 Assert.IsNotNull(instance.Req_four);
Jens Geyer62445c12022-06-29 00:00:00 +020091 instance.Req_five = default;
92 instance.Req_six = default;
93 instance.Req_seven = default;
Jens Geyer3cac3202022-01-31 18:04:35 +010094 instance.Req_eight = default;
Jens Geyer62445c12022-06-29 00:00:00 +020095 Assert.IsNotNull(instance.Req_nine);
Jens Geyeraffea7b2020-05-22 17:28:30 +020096
97 // leave non-required fields unset again
98 Assert.IsFalse(instance.__isset.def_one);
99 Assert.IsFalse(instance.__isset.def_two);
100 Assert.IsFalse(instance.__isset.def_three);
101 Assert.IsFalse(instance.__isset.def_four);
102 Assert.IsFalse(instance.__isset.def_five);
103 Assert.IsFalse(instance.__isset.def_six);
104 Assert.IsFalse(instance.__isset.def_seven);
105 Assert.IsFalse(instance.__isset.def_eight);
Jens Geyer62445c12022-06-29 00:00:00 +0200106 Assert.IsFalse(instance.__isset.def_nine);
Jens Geyeraffea7b2020-05-22 17:28:30 +0200107
108 // these should have IDL defaults set
109
110 Assert.IsTrue(instance.__isset.opt_one_with_value);
111 Assert.IsTrue(instance.__isset.opt_two_with_value);
112 Assert.IsTrue(instance.__isset.opt_three_with_value);
113 Assert.IsTrue(instance.__isset.opt_four_with_value);
114 Assert.IsTrue(instance.__isset.opt_five_with_value);
115 Assert.IsTrue(instance.__isset.opt_six_with_value);
116 Assert.IsTrue(instance.__isset.opt_seven_with_value);
117 Assert.IsTrue(instance.__isset.opt_eight_with_value);
Jens Geyer62445c12022-06-29 00:00:00 +0200118 Assert.IsTrue(instance.__isset.opt_nine_with_value);
Jens Geyeraffea7b2020-05-22 17:28:30 +0200119
120 Assert.AreEqual(instance.Req_one_with_value, (Distance)1);
121 Assert.AreEqual(instance.Req_two_with_value, 2.22);
122 Assert.AreEqual(instance.Req_three_with_value, 3);
123 Assert.AreEqual(instance.Req_four_with_value, "four");
Jens Geyer62445c12022-06-29 00:00:00 +0200124 Assert.AreEqual(new Guid("55555555-5555-5555-5555-000000000000"), instance.Req_five_with_value);
Jens Geyeraffea7b2020-05-22 17:28:30 +0200125
Jens Geyer3cac3202022-01-31 18:04:35 +0100126 Assert.IsTrue(instance.Req_six_with_value!.Count == 1);
Jens Geyeraffea7b2020-05-22 17:28:30 +0200127 Assert.AreEqual(instance.Req_six_with_value[0], 6 );
128
Jens Geyer3cac3202022-01-31 18:04:35 +0100129 Assert.IsTrue(instance.Req_seven_with_value!.Count == 1);
Jens Geyeraffea7b2020-05-22 17:28:30 +0200130 Assert.IsTrue(instance.Req_seven_with_value.Contains(7));
131
Jens Geyer3cac3202022-01-31 18:04:35 +0100132 Assert.IsTrue(instance.Req_eight_with_value!.Count == 1);
Jens Geyeraffea7b2020-05-22 17:28:30 +0200133 Assert.IsTrue(instance.Req_eight_with_value[8] == 8);
134
Jens Geyer62445c12022-06-29 00:00:00 +0200135 Assert.AreEqual("nine", Encoding.UTF8.GetString(instance.Req_nine_with_value!));
136
Jens Geyeraffea7b2020-05-22 17:28:30 +0200137 Assert.IsTrue(instance.__isset.def_one_with_value);
138 Assert.IsTrue(instance.__isset.def_two_with_value);
139 Assert.IsTrue(instance.__isset.def_three_with_value);
140 Assert.IsTrue(instance.__isset.def_four_with_value);
141 Assert.IsTrue(instance.__isset.def_five_with_value);
142 Assert.IsTrue(instance.__isset.def_six_with_value);
143 Assert.IsTrue(instance.__isset.def_seven_with_value);
144 Assert.IsTrue(instance.__isset.def_eight_with_value);
Jens Geyer62445c12022-06-29 00:00:00 +0200145 Assert.IsTrue(instance.__isset.def_nine_with_value);
Jens Geyeraffea7b2020-05-22 17:28:30 +0200146
147 instance.Last_of_the_mohicans = true;
148
149 if (nesting < 2)
150 {
Jens Geyer4115e952023-11-21 23:00:01 +0100151 instance.Far_list = [Distance.foo, Distance.bar, Distance.baz];
152 instance.Far_set = [Distance.foo, Distance.bar, Distance.baz];
153 instance.Far_map = new() { [Distance.foo] = Distance.foo, [Distance.bar] = Distance.bar, [Distance.baz] = Distance.baz };
Jens Geyeraffea7b2020-05-22 17:28:30 +0200154
Jens Geyer4115e952023-11-21 23:00:01 +0100155 instance.Far_set_list = [[Distance.foo]];
156 instance.Far_list_map_set = [new Dictionary<sbyte, HashSet<Distance>>() { [1] = [Distance.baz] }];
Jens Geyer3cac3202022-01-31 18:04:35 +0100157
Jens Geyer4115e952023-11-21 23:00:01 +0100158 instance.Far_map_dist_to_rds = new() { [Distance.bar] = [] };
Jens Geyer3cac3202022-01-31 18:04:35 +0100159 var details = MakeNestedRaceDetails(nesting);
160 if (details != null)
161 instance.Far_map_dist_to_rds[Distance.bar].Add(details);
Jens Geyeraffea7b2020-05-22 17:28:30 +0200162
163 instance.Req_nested = MakeNestedRaceDetails(nesting);
164 Assert.IsFalse(instance.__isset.opt_nested);
165 Assert.IsFalse(instance.__isset.def_nested);
166
167 instance.Req_union = MakeNestedUnion(nesting);
168 Assert.IsFalse(instance.__isset.opt_union);
169 Assert.IsFalse(instance.__isset.def_union);
170 }
171
172 instance.Triplesix = (Distance)666;
173
174 return instance;
175 }
176
177 private void ModifyInstance(RaceDetails instance, int level)
178 {
179 if ((instance == null) || (++level > 4))
180 return;
181
182 instance.Opt_one = ModifyValue(instance.Opt_one);
183 instance.Opt_two = ModifyValue(instance.Opt_two);
184 instance.Opt_three = ModifyValue(instance.Opt_three);
185 instance.Opt_four = ModifyValue(instance.Opt_four);
186 instance.Opt_five = ModifyValue(instance.Opt_five);
187 instance.Opt_six = ModifyValue(instance.Opt_six);
188 instance.Opt_seven = ModifyValue(instance.Opt_seven);
189 instance.Opt_eight = ModifyValue(instance.Opt_eight);
Jens Geyer62445c12022-06-29 00:00:00 +0200190 instance.Opt_nine = ModifyValue(instance.Opt_nine);
Jens Geyeraffea7b2020-05-22 17:28:30 +0200191
192 instance.Req_one = ModifyValue(instance.Req_one);
193 instance.Req_two = ModifyValue(instance.Req_two);
194 instance.Req_three = ModifyValue(instance.Req_three);
195 instance.Req_four = ModifyValue(instance.Req_four);
196 instance.Req_five = ModifyValue(instance.Req_five);
197 instance.Req_six = ModifyValue(instance.Req_six);
198 instance.Req_seven = ModifyValue(instance.Req_seven);
199 instance.Req_eight = ModifyValue(instance.Req_eight);
Jens Geyer62445c12022-06-29 00:00:00 +0200200 instance.Req_nine = ModifyValue(instance.Req_nine);
Jens Geyeraffea7b2020-05-22 17:28:30 +0200201
202 instance.Def_one = ModifyValue(instance.Def_one);
203 instance.Def_two = ModifyValue(instance.Def_two);
204 instance.Def_three = ModifyValue(instance.Def_three);
205 instance.Def_four = ModifyValue(instance.Def_four);
206 instance.Def_five = ModifyValue(instance.Def_five);
207 instance.Def_six = ModifyValue(instance.Def_six);
208 instance.Def_seven = ModifyValue(instance.Def_seven);
209 instance.Def_eight = ModifyValue(instance.Def_eight);
Jens Geyer62445c12022-06-29 00:00:00 +0200210 instance.Def_nine = ModifyValue(instance.Def_nine);
Jens Geyeraffea7b2020-05-22 17:28:30 +0200211
212 instance.Opt_one_with_value = ModifyValue(instance.Opt_one_with_value);
213 instance.Opt_two_with_value = ModifyValue(instance.Opt_two_with_value);
214 instance.Opt_three_with_value = ModifyValue(instance.Opt_three_with_value);
215 instance.Opt_four_with_value = ModifyValue(instance.Opt_four_with_value);
216 instance.Opt_five_with_value = ModifyValue(instance.Opt_five_with_value);
217 instance.Opt_six_with_value = ModifyValue(instance.Opt_six_with_value);
218 instance.Opt_seven_with_value = ModifyValue(instance.Opt_seven_with_value);
219 instance.Opt_eight_with_value = ModifyValue(instance.Opt_eight_with_value);
Jens Geyer62445c12022-06-29 00:00:00 +0200220 instance.Opt_nine_with_value = ModifyValue(instance.Opt_nine_with_value);
Jens Geyeraffea7b2020-05-22 17:28:30 +0200221
222 instance.Req_one_with_value = ModifyValue(instance.Req_one_with_value);
223 instance.Req_two_with_value = ModifyValue(instance.Req_two_with_value);
224 instance.Req_three_with_value = ModifyValue(instance.Req_three_with_value);
225 instance.Req_four_with_value = ModifyValue(instance.Req_four_with_value);
226 instance.Req_five_with_value = ModifyValue(instance.Req_five_with_value);
227 instance.Req_six_with_value = ModifyValue(instance.Req_six_with_value);
228 instance.Req_seven_with_value = ModifyValue(instance.Req_seven_with_value);
229 instance.Req_eight_with_value = ModifyValue(instance.Req_eight_with_value);
Jens Geyer62445c12022-06-29 00:00:00 +0200230 instance.Req_nine_with_value = ModifyValue(instance.Req_nine_with_value);
Jens Geyeraffea7b2020-05-22 17:28:30 +0200231
232 instance.Def_one_with_value = ModifyValue(instance.Def_one_with_value);
233 instance.Def_two_with_value = ModifyValue(instance.Def_two_with_value);
234 instance.Def_three_with_value = ModifyValue(instance.Def_three_with_value);
235 instance.Def_four_with_value = ModifyValue(instance.Def_four_with_value);
236 instance.Def_five_with_value = ModifyValue(instance.Def_five_with_value);
237 instance.Def_six_with_value = ModifyValue(instance.Def_six_with_value);
238 instance.Def_seven_with_value = ModifyValue(instance.Def_seven_with_value);
239 instance.Def_eight_with_value = ModifyValue(instance.Def_eight_with_value);
Jens Geyer62445c12022-06-29 00:00:00 +0200240 instance.Def_nine_with_value = ModifyValue(instance.Def_nine_with_value);
Jens Geyeraffea7b2020-05-22 17:28:30 +0200241
242 instance.Last_of_the_mohicans = ModifyValue(instance.Last_of_the_mohicans);
243
244 instance.Far_list = ModifyValue(instance.Far_list);
245 instance.Far_set = ModifyValue(instance.Far_set);
246 instance.Far_map = ModifyValue(instance.Far_map);
247
248 instance.Far_set_list = ModifyValue(instance.Far_set_list);
249 instance.Far_list_map_set = ModifyValue(instance.Far_list_map_set);
250 instance.Far_map_dist_to_rds = ModifyValue(instance.Far_map_dist_to_rds, level);
251
252 instance.Req_nested = ModifyValue(instance.Req_nested, level);
253 instance.Opt_nested = ModifyValue(instance.Opt_nested, level);
254 instance.Def_nested = ModifyValue(instance.Def_nested, level);
255
256 instance.Req_union = ModifyValue(instance.Req_union, level);
257 instance.Opt_union = ModifyValue(instance.Opt_union, level);
258 instance.Def_union = ModifyValue(instance.Def_union, level);
259
260 instance.Triplesix = ModifyValue(instance.Triplesix);
261 }
262
Jens Geyer3cac3202022-01-31 18:04:35 +0100263 private jack? ModifyValue(jack? value, int level)
Jens Geyeraffea7b2020-05-22 17:28:30 +0200264 {
265 if (++level > 4)
266 return value;
267
Jens Geyer4115e952023-11-21 23:00:01 +0100268 value ??= MakeNestedUnion(0);
Jens Geyer3cac3202022-01-31 18:04:35 +0100269 Debug.Assert(value?.As_nested_struct != null);
Jens Geyeraffea7b2020-05-22 17:28:30 +0200270 ModifyInstance(value.As_nested_struct, level);
271 return value;
272 }
273
Jens Geyer3cac3202022-01-31 18:04:35 +0100274 private RaceDetails? ModifyValue(RaceDetails? value, int level)
Jens Geyeraffea7b2020-05-22 17:28:30 +0200275 {
276 if (++level > 4)
277 return value;
278
Jens Geyer4115e952023-11-21 23:00:01 +0100279 value ??= new RaceDetails();
Jens Geyeraffea7b2020-05-22 17:28:30 +0200280 ModifyInstance(value,level);
281 return value;
282 }
283
Jens Geyer3cac3202022-01-31 18:04:35 +0100284 private Dictionary<Distance, List<RaceDetails>> ModifyValue(Dictionary<Distance, List<RaceDetails>>? value, int level)
Jens Geyeraffea7b2020-05-22 17:28:30 +0200285 {
Jens Geyer4115e952023-11-21 23:00:01 +0100286 value ??= [];
Jens Geyeraffea7b2020-05-22 17:28:30 +0200287
288 if (++level > 4)
289 return value;
290
291 var details = new RaceDetails();
292 InitializeInstance(details);
Jens Geyer4115e952023-11-21 23:00:01 +0100293 value[Distance.foo] = [details];
Jens Geyeraffea7b2020-05-22 17:28:30 +0200294
295 if (value.TryGetValue(Distance.bar, out var list) && (list.Count > 0))
296 {
297 ModifyInstance(list[0], level);
Jens Geyer3cac3202022-01-31 18:04:35 +0100298 //list.Add(null); -- Thrift does not allow null values in containers
Jens Geyeraffea7b2020-05-22 17:28:30 +0200299 }
300
Jens Geyer3cac3202022-01-31 18:04:35 +0100301 // Thrift does not allow null values in containers
302 //value[Distance.baz] = null;
Jens Geyeraffea7b2020-05-22 17:28:30 +0200303
304 return value;
305 }
306
Jens Geyer3cac3202022-01-31 18:04:35 +0100307 private static List<Dictionary<sbyte, HashSet<Distance>>> ModifyValue(List<Dictionary<sbyte, HashSet<Distance>>>? value)
Jens Geyeraffea7b2020-05-22 17:28:30 +0200308 {
Jens Geyer4115e952023-11-21 23:00:01 +0100309 value ??= [];
Jens Geyeraffea7b2020-05-22 17:28:30 +0200310
311 if (value.Count == 0)
Jens Geyer4115e952023-11-21 23:00:01 +0100312 value.Add([]);
Jens Geyer3cac3202022-01-31 18:04:35 +0100313 //else
314 //value.Add(null); --Thrift does not allow null values in containers
Jens Geyeraffea7b2020-05-22 17:28:30 +0200315
316 sbyte key = (sbyte)(value[0].Count + 10);
317 if (value[0].Count == 0)
Jens Geyer4115e952023-11-21 23:00:01 +0100318 value[0].Add(key, []);
Jens Geyer3cac3202022-01-31 18:04:35 +0100319 //else
320 //value[0].Add(key, null); --Thrift does not allow null values in containers
Jens Geyeraffea7b2020-05-22 17:28:30 +0200321
322 foreach (var entry in value)
323 {
324 if (entry != null)
325 {
326 foreach (var pair in entry)
327 {
328 if (pair.Value != null)
329 {
Jens Geyer4115e952023-11-21 23:00:01 +0100330 if (!pair.Value.Remove(Distance.baz))
Jens Geyeraffea7b2020-05-22 17:28:30 +0200331 pair.Value.Add(Distance.baz);
332 }
333 }
334 }
335 }
336
337 return value;
338 }
339
Jens Geyer3cac3202022-01-31 18:04:35 +0100340 private static HashSet<List<Distance>> ModifyValue(HashSet<List<Distance>>? value)
Jens Geyeraffea7b2020-05-22 17:28:30 +0200341 {
Jens Geyer4115e952023-11-21 23:00:01 +0100342 value ??= [];
Jens Geyeraffea7b2020-05-22 17:28:30 +0200343
344 if (value.Count == 0)
Jens Geyer4115e952023-11-21 23:00:01 +0100345 value.Add([]);
Jens Geyer3cac3202022-01-31 18:04:35 +0100346 //else
347 //value.Add(null); -- Thrift does not allow null values in containers
Jens Geyeraffea7b2020-05-22 17:28:30 +0200348
349 foreach (var entry in value)
Jens Geyer4115e952023-11-21 23:00:01 +0100350 entry?.Add(Distance.baz);
Jens Geyeraffea7b2020-05-22 17:28:30 +0200351
352 return value;
353 }
354
Jens Geyer3cac3202022-01-31 18:04:35 +0100355 private static Dictionary<Distance, Distance> ModifyValue(Dictionary<Distance, Distance>? value)
Jens Geyeraffea7b2020-05-22 17:28:30 +0200356 {
Jens Geyer4115e952023-11-21 23:00:01 +0100357 value ??= [];
Jens Geyeraffea7b2020-05-22 17:28:30 +0200358 value[Distance.foo] = value.ContainsKey(Distance.foo) ? ++value[Distance.foo] : Distance.foo;
359 value[Distance.bar] = value.ContainsKey(Distance.bar) ? ++value[Distance.bar] : Distance.bar;
360 value[Distance.baz] = value.ContainsKey(Distance.baz) ? ++value[Distance.baz] : Distance.baz;
361 return value;
362 }
363
Jens Geyer3cac3202022-01-31 18:04:35 +0100364 private static HashSet<Distance> ModifyValue(HashSet<Distance>? value)
Jens Geyeraffea7b2020-05-22 17:28:30 +0200365 {
Jens Geyer4115e952023-11-21 23:00:01 +0100366 value ??= [];
Jens Geyeraffea7b2020-05-22 17:28:30 +0200367
Jens Geyer4115e952023-11-21 23:00:01 +0100368 if (!value.Remove(Distance.foo))
Jens Geyeraffea7b2020-05-22 17:28:30 +0200369 value.Add(Distance.foo);
370
Jens Geyer4115e952023-11-21 23:00:01 +0100371 if (!value.Remove(Distance.bar))
Jens Geyeraffea7b2020-05-22 17:28:30 +0200372 value.Add(Distance.bar);
373
Jens Geyer4115e952023-11-21 23:00:01 +0100374 if (!value.Remove(Distance.baz))
Jens Geyeraffea7b2020-05-22 17:28:30 +0200375 value.Add(Distance.baz);
376
377 return value;
378 }
379
Jens Geyer3cac3202022-01-31 18:04:35 +0100380 private static List<Distance> ModifyValue(List<Distance>? value)
Jens Geyeraffea7b2020-05-22 17:28:30 +0200381 {
Jens Geyer4115e952023-11-21 23:00:01 +0100382 value ??= [];
Jens Geyeraffea7b2020-05-22 17:28:30 +0200383 value.Add(Distance.foo);
384 value.Add(Distance.bar);
385 value.Add(Distance.baz);
386 return value;
387 }
388
Jens Geyer98a23252022-01-09 16:50:52 +0100389 private static bool ModifyValue(bool value)
Jens Geyeraffea7b2020-05-22 17:28:30 +0200390 {
391 return !value;
392 }
393
Jens Geyer3cac3202022-01-31 18:04:35 +0100394 private static Dictionary<sbyte, short> ModifyValue(Dictionary<sbyte, short>? value)
Jens Geyeraffea7b2020-05-22 17:28:30 +0200395 {
Jens Geyer4115e952023-11-21 23:00:01 +0100396 value ??= [];
Jens Geyeraffea7b2020-05-22 17:28:30 +0200397 value.Add((sbyte)(value.Count + 10), (short)value.Count);
398 return value;
399 }
400
Jens Geyer3cac3202022-01-31 18:04:35 +0100401 private static HashSet<long> ModifyValue(HashSet<long>? value)
Jens Geyeraffea7b2020-05-22 17:28:30 +0200402 {
Jens Geyer4115e952023-11-21 23:00:01 +0100403 value ??= [];
Jens Geyeraffea7b2020-05-22 17:28:30 +0200404 value.Add(value.Count+100);
405 return value;
406 }
407
Jens Geyer3cac3202022-01-31 18:04:35 +0100408 private static List<int> ModifyValue(List<int>? value)
Jens Geyeraffea7b2020-05-22 17:28:30 +0200409 {
Jens Geyer4115e952023-11-21 23:00:01 +0100410 value ??= [];
Jens Geyeraffea7b2020-05-22 17:28:30 +0200411 value.Add(value.Count);
412 return value;
413 }
414
Jens Geyer3cac3202022-01-31 18:04:35 +0100415 private static byte[] ModifyValue(byte[]? value)
Jens Geyeraffea7b2020-05-22 17:28:30 +0200416 {
Jens Geyer4115e952023-11-21 23:00:01 +0100417 value ??= [0];
Jens Geyeraffea7b2020-05-22 17:28:30 +0200418 if (value.Length > 0)
419 value[0] = (value[0] < 0xFF) ? ++value[0] : (byte)0;
Jens Geyer3cac3202022-01-31 18:04:35 +0100420 else
Jens Geyer4115e952023-11-21 23:00:01 +0100421 value = [0];
Jens Geyeraffea7b2020-05-22 17:28:30 +0200422 return value;
423 }
424
Jens Geyer3cac3202022-01-31 18:04:35 +0100425 private static string ModifyValue(string? value)
Jens Geyeraffea7b2020-05-22 17:28:30 +0200426 {
427 return value + "1";
428 }
429
Jens Geyer62445c12022-06-29 00:00:00 +0200430 private static Guid ModifyValue(Guid value)
431 {
432 return new Guid( ModifyValue(value.ToByteArray()));
433 }
434
Jens Geyer98a23252022-01-09 16:50:52 +0100435 private static double ModifyValue(double value)
Jens Geyeraffea7b2020-05-22 17:28:30 +0200436 {
437 return value + 1.1;
438 }
439
Jens Geyer98a23252022-01-09 16:50:52 +0100440 private static short ModifyValue(short value)
Jens Geyeraffea7b2020-05-22 17:28:30 +0200441 {
442 return ++value;
443 }
444
Jens Geyer98a23252022-01-09 16:50:52 +0100445 private static Distance ModifyValue(Distance value)
Jens Geyeraffea7b2020-05-22 17:28:30 +0200446 {
447 return ++value;
448 }
449
Jens Geyer98a23252022-01-09 16:50:52 +0100450 private static void VerifyDifferentContent(RaceDetails first, RaceDetails second)
Jens Geyeraffea7b2020-05-22 17:28:30 +0200451 {
452 Assert.AreNotEqual(first, second);
453
454 Assert.AreNotEqual(first.Opt_two, second.Opt_two);
455 Assert.AreNotEqual(first.Opt_three, second.Opt_three);
456 Assert.AreNotEqual(first.Opt_four, second.Opt_four);
457 Assert.IsFalse(TCollections.Equals(first.Opt_five, second.Opt_five));
458 Assert.IsFalse(TCollections.Equals(first.Opt_six, second.Opt_six));
459 Assert.IsFalse(TCollections.Equals(first.Opt_seven, second.Opt_seven));
460 Assert.IsFalse(TCollections.Equals(first.Opt_eight, second.Opt_eight));
Jens Geyer62445c12022-06-29 00:00:00 +0200461 Assert.IsFalse(TCollections.Equals(first.Opt_nine, second.Opt_nine));
Jens Geyeraffea7b2020-05-22 17:28:30 +0200462
463 Assert.AreNotEqual(first.Req_one, second.Req_one);
464 Assert.AreNotEqual(first.Req_two, second.Req_two);
465 Assert.AreNotEqual(first.Req_three, second.Req_three);
466 Assert.AreNotEqual(first.Req_four, second.Req_four);
467 Assert.IsFalse(TCollections.Equals(first.Req_five, second.Req_five));
468 Assert.IsFalse(TCollections.Equals(first.Req_six, second.Req_six));
469 Assert.IsFalse(TCollections.Equals(first.Req_seven, second.Req_seven));
470 Assert.IsFalse(TCollections.Equals(first.Req_eight, second.Req_eight));
Jens Geyer62445c12022-06-29 00:00:00 +0200471 Assert.IsFalse(TCollections.Equals(first.Req_nine, second.Req_nine));
Jens Geyeraffea7b2020-05-22 17:28:30 +0200472
473 Assert.AreNotEqual(first.Def_one, second.Def_one);
474 Assert.AreNotEqual(first.Def_two, second.Def_two);
475 Assert.AreNotEqual(first.Def_three, second.Def_three);
476 Assert.AreNotEqual(first.Def_four, second.Def_four);
477 Assert.IsFalse(TCollections.Equals(first.Def_five, second.Def_five));
478 Assert.IsFalse(TCollections.Equals(first.Def_six, second.Def_six));
479 Assert.IsFalse(TCollections.Equals(first.Def_seven, second.Def_seven));
480 Assert.IsFalse(TCollections.Equals(first.Def_eight, second.Def_eight));
Jens Geyer62445c12022-06-29 00:00:00 +0200481 Assert.IsFalse(TCollections.Equals(first.Def_nine, second.Def_nine));
Jens Geyeraffea7b2020-05-22 17:28:30 +0200482
483 Assert.AreNotEqual(first.Opt_one_with_value, second.Opt_one_with_value);
484 Assert.AreNotEqual(first.Opt_two_with_value, second.Opt_two_with_value);
485 Assert.AreNotEqual(first.Opt_three_with_value, second.Opt_three_with_value);
486 Assert.AreNotEqual(first.Opt_four_with_value, second.Opt_four_with_value);
487 Assert.IsFalse(TCollections.Equals(first.Opt_five_with_value, second.Opt_five_with_value));
488 Assert.IsFalse(TCollections.Equals(first.Opt_six_with_value, second.Opt_six_with_value));
489 Assert.IsFalse(TCollections.Equals(first.Opt_seven_with_value, second.Opt_seven_with_value));
490 Assert.IsFalse(TCollections.Equals(first.Opt_eight_with_value, second.Opt_eight_with_value));
Jens Geyer62445c12022-06-29 00:00:00 +0200491 Assert.IsFalse(TCollections.Equals(first.Opt_nine_with_value, second.Opt_nine_with_value));
Jens Geyeraffea7b2020-05-22 17:28:30 +0200492
493 Assert.AreNotEqual(first.Req_one_with_value, second.Req_one_with_value);
494 Assert.AreNotEqual(first.Req_two_with_value, second.Req_two_with_value);
495 Assert.AreNotEqual(first.Req_three_with_value, second.Req_three_with_value);
496 Assert.AreNotEqual(first.Req_four_with_value, second.Req_four_with_value);
497 Assert.IsFalse(TCollections.Equals(first.Req_five_with_value, second.Req_five_with_value));
498 Assert.IsFalse(TCollections.Equals(first.Req_six_with_value, second.Req_six_with_value));
499 Assert.IsFalse(TCollections.Equals(first.Req_seven_with_value, second.Req_seven_with_value));
500 Assert.IsFalse(TCollections.Equals(first.Req_eight_with_value, second.Req_eight_with_value));
Jens Geyer62445c12022-06-29 00:00:00 +0200501 Assert.IsFalse(TCollections.Equals(first.Req_nine_with_value, second.Req_nine_with_value));
Jens Geyeraffea7b2020-05-22 17:28:30 +0200502
503 Assert.AreNotEqual(first.Def_one_with_value, second.Def_one_with_value);
504 Assert.AreNotEqual(first.Def_two_with_value, second.Def_two_with_value);
505 Assert.AreNotEqual(first.Def_three_with_value, second.Def_three_with_value);
506 Assert.AreNotEqual(first.Def_four_with_value, second.Def_four_with_value);
507 Assert.IsFalse(TCollections.Equals(first.Def_five_with_value, second.Def_five_with_value));
508 Assert.IsFalse(TCollections.Equals(first.Def_six_with_value, second.Def_six_with_value));
509 Assert.IsFalse(TCollections.Equals(first.Def_seven_with_value, second.Def_seven_with_value));
510 Assert.IsFalse(TCollections.Equals(first.Def_eight_with_value, second.Def_eight_with_value));
Jens Geyer62445c12022-06-29 00:00:00 +0200511 Assert.IsFalse(TCollections.Equals(first.Def_nine_with_value, second.Def_nine_with_value));
Jens Geyeraffea7b2020-05-22 17:28:30 +0200512
513 Assert.AreNotEqual(first.Last_of_the_mohicans, second.Last_of_the_mohicans);
514
515 Assert.IsFalse(TCollections.Equals(first.Far_list, second.Far_list));
516 Assert.IsFalse(TCollections.Equals(first.Far_set, second.Far_set));
517 Assert.IsFalse(TCollections.Equals(first.Far_map, second.Far_map));
518
519 Assert.IsFalse(TCollections.Equals(first.Far_set_list, second.Far_set_list));
520 Assert.IsFalse(TCollections.Equals(first.Far_list_map_set, second.Far_list_map_set));
521 Assert.IsFalse(TCollections.Equals(first.Far_map_dist_to_rds, second.Far_map_dist_to_rds));
522
523 Assert.AreNotEqual(first.Req_nested, second.Req_nested);
524 Assert.AreNotEqual(first.Opt_nested, second.Opt_nested);
525 Assert.AreNotEqual(first.Def_nested, second.Def_nested);
526
527 Assert.AreNotEqual(first.Req_union, second.Req_union);
528 Assert.AreNotEqual(first.Opt_union, second.Opt_union);
529 Assert.AreNotEqual(first.Def_union, second.Def_union);
530
531 Assert.AreNotEqual(first.Triplesix, second.Triplesix);
532 }
533
Jens Geyer98a23252022-01-09 16:50:52 +0100534 private static void VerifyIdenticalContent(RaceDetails first, RaceDetails second)
Jens Geyeraffea7b2020-05-22 17:28:30 +0200535 {
536 Assert.AreEqual(first, second);
537
538 Assert.AreEqual(first.Opt_two, second.Opt_two);
539 Assert.AreEqual(first.Opt_three, second.Opt_three);
540 Assert.AreEqual(first.Opt_four, second.Opt_four);
541 Assert.IsTrue(TCollections.Equals(first.Opt_five, second.Opt_five));
542 Assert.IsTrue(TCollections.Equals(first.Opt_six, second.Opt_six));
543 Assert.IsTrue(TCollections.Equals(first.Opt_seven, second.Opt_seven));
544 Assert.IsTrue(TCollections.Equals(first.Opt_eight, second.Opt_eight));
Jens Geyer62445c12022-06-29 00:00:00 +0200545 Assert.IsTrue(TCollections.Equals(first.Opt_nine, second.Opt_nine));
Jens Geyeraffea7b2020-05-22 17:28:30 +0200546
547 Assert.AreEqual(first.Req_one, second.Req_one);
548 Assert.AreEqual(first.Req_two, second.Req_two);
549 Assert.AreEqual(first.Req_three, second.Req_three);
550 Assert.AreEqual(first.Req_four, second.Req_four);
551 Assert.IsTrue(TCollections.Equals(first.Req_five, second.Req_five));
552 Assert.IsTrue(TCollections.Equals(first.Req_six, second.Req_six));
553 Assert.IsTrue(TCollections.Equals(first.Req_seven, second.Req_seven));
554 Assert.IsTrue(TCollections.Equals(first.Req_eight, second.Req_eight));
Jens Geyer62445c12022-06-29 00:00:00 +0200555 Assert.IsTrue(TCollections.Equals(first.Req_nine, second.Req_nine));
Jens Geyeraffea7b2020-05-22 17:28:30 +0200556
557 Assert.AreEqual(first.Def_one, second.Def_one);
558 Assert.AreEqual(first.Def_two, second.Def_two);
559 Assert.AreEqual(first.Def_three, second.Def_three);
560 Assert.AreEqual(first.Def_four, second.Def_four);
561 Assert.IsTrue(TCollections.Equals(first.Def_five, second.Def_five));
562 Assert.IsTrue(TCollections.Equals(first.Def_six, second.Def_six));
563 Assert.IsTrue(TCollections.Equals(first.Def_seven, second.Def_seven));
564 Assert.IsTrue(TCollections.Equals(first.Def_eight, second.Def_eight));
Jens Geyer62445c12022-06-29 00:00:00 +0200565 Assert.IsTrue(TCollections.Equals(first.Def_nine, second.Def_nine));
Jens Geyeraffea7b2020-05-22 17:28:30 +0200566
567 Assert.AreEqual(first.Opt_one_with_value, second.Opt_one_with_value);
568 Assert.AreEqual(first.Opt_two_with_value, second.Opt_two_with_value);
569 Assert.AreEqual(first.Opt_three_with_value, second.Opt_three_with_value);
570 Assert.AreEqual(first.Opt_four_with_value, second.Opt_four_with_value);
571 Assert.IsTrue(TCollections.Equals(first.Opt_five_with_value, second.Opt_five_with_value));
572 Assert.IsTrue(TCollections.Equals(first.Opt_six_with_value, second.Opt_six_with_value));
573 Assert.IsTrue(TCollections.Equals(first.Opt_seven_with_value, second.Opt_seven_with_value));
574 Assert.IsTrue(TCollections.Equals(first.Opt_eight_with_value, second.Opt_eight_with_value));
Jens Geyer62445c12022-06-29 00:00:00 +0200575 Assert.IsTrue(TCollections.Equals(first.Opt_nine_with_value, second.Opt_nine_with_value));
Jens Geyeraffea7b2020-05-22 17:28:30 +0200576
577 Assert.AreEqual(first.Req_one_with_value, second.Req_one_with_value);
578 Assert.AreEqual(first.Req_two_with_value, second.Req_two_with_value);
579 Assert.AreEqual(first.Req_three_with_value, second.Req_three_with_value);
580 Assert.AreEqual(first.Req_four_with_value, second.Req_four_with_value);
581 Assert.IsTrue(TCollections.Equals(first.Req_five_with_value, second.Req_five_with_value));
582 Assert.IsTrue(TCollections.Equals(first.Req_six_with_value, second.Req_six_with_value));
583 Assert.IsTrue(TCollections.Equals(first.Req_seven_with_value, second.Req_seven_with_value));
584 Assert.IsTrue(TCollections.Equals(first.Req_eight_with_value, second.Req_eight_with_value));
Jens Geyer62445c12022-06-29 00:00:00 +0200585 Assert.IsTrue(TCollections.Equals(first.Req_nine_with_value, second.Req_nine_with_value));
Jens Geyeraffea7b2020-05-22 17:28:30 +0200586
587 Assert.AreEqual(first.Def_one_with_value, second.Def_one_with_value);
588 Assert.AreEqual(first.Def_two_with_value, second.Def_two_with_value);
589 Assert.AreEqual(first.Def_three_with_value, second.Def_three_with_value);
590 Assert.AreEqual(first.Def_four_with_value, second.Def_four_with_value);
591 Assert.IsTrue(TCollections.Equals(first.Def_five_with_value, second.Def_five_with_value));
592 Assert.IsTrue(TCollections.Equals(first.Def_six_with_value, second.Def_six_with_value));
593 Assert.IsTrue(TCollections.Equals(first.Def_seven_with_value, second.Def_seven_with_value));
594 Assert.IsTrue(TCollections.Equals(first.Def_eight_with_value, second.Def_eight_with_value));
Jens Geyer62445c12022-06-29 00:00:00 +0200595 Assert.IsTrue(TCollections.Equals(first.Def_nine_with_value, second.Def_nine_with_value));
Jens Geyeraffea7b2020-05-22 17:28:30 +0200596
597 Assert.AreEqual(first.Last_of_the_mohicans, second.Last_of_the_mohicans);
598
599 Assert.IsTrue(TCollections.Equals(first.Far_list, second.Far_list));
600 Assert.IsTrue(TCollections.Equals(first.Far_set, second.Far_set));
601 Assert.IsTrue(TCollections.Equals(first.Far_map, second.Far_map));
602
603 Assert.IsTrue(TCollections.Equals(first.Far_set_list, second.Far_set_list));
604 Assert.IsTrue(TCollections.Equals(first.Far_list_map_set, second.Far_list_map_set));
605 Assert.IsTrue(TCollections.Equals(first.Far_map_dist_to_rds, second.Far_map_dist_to_rds));
606
607 Assert.AreEqual(first.Req_nested, second.Req_nested);
608 Assert.AreEqual(first.Opt_nested, second.Opt_nested);
609 Assert.AreEqual(first.Def_nested, second.Def_nested);
610
611 Assert.AreEqual(first.Req_union, second.Req_union);
612 Assert.AreEqual(first.Opt_union, second.Opt_union);
613 Assert.AreEqual(first.Def_union, second.Def_union);
614
615 Assert.AreEqual(first.Triplesix, second.Triplesix);
616 }
617
618 }
619}