@@ -40,6 +40,9 @@ class TestSerialization : public TestBase {
40
40
void testDeSerializeLongString ();
41
41
void testStreamRead ();
42
42
void testStreamWrite ();
43
+ void testVecPut ();
44
+ void testStringLengthLimits ();
45
+ void testBufReader ();
43
46
44
47
std::string teststring2;
45
48
std::wstring teststring2_w;
@@ -64,6 +67,9 @@ void TestSerialization::runTests(IGameDef *gamedef)
64
67
TEST (testSerializeHex);
65
68
TEST (testStreamRead);
66
69
TEST (testStreamWrite);
70
+ TEST (testVecPut);
71
+ TEST (testStringLengthLimits);
72
+ TEST (testBufReader);
67
73
}
68
74
69
75
// //////////////////////////////////////////////////////////////////////////////
@@ -369,6 +375,263 @@ void TestSerialization::testStreamWrite()
369
375
}
370
376
371
377
378
+ void TestSerialization::testVecPut ()
379
+ {
380
+ std::vector<u8> buf;
381
+
382
+ putU8 (&buf, 0x11 );
383
+ putU16 (&buf, 0x2233 );
384
+ putU32 (&buf, 0x44556677 );
385
+ putU64 (&buf, 0x8899AABBCCDDEEFF );
386
+
387
+ putS8 (&buf, -128 );
388
+ putS16 (&buf, 30000 );
389
+ putS32 (&buf, -6 );
390
+ putS64 (&buf, -43 );
391
+
392
+ putF1000 (&buf, 53 .53467f );
393
+ putF1000 (&buf, -300000 .32f );
394
+ putF1000 (&buf, F1000_MIN);
395
+ putF1000 (&buf, F1000_MAX);
396
+
397
+ putString (&buf, " foobar!" );
398
+
399
+ putV2S16 (&buf, v2s16 (500 , 500 ));
400
+ putV3S16 (&buf, v3s16 (4207 , 604 , -30 ));
401
+ putV2S32 (&buf, v2s32 (1920 , 1080 ));
402
+ putV3S32 (&buf, v3s32 (-400 , 6400054 , 290549855 ));
403
+ putV2F1000 (&buf, v2f (500 .65661f , 350 .34567f ));
404
+
405
+ putWideString (&buf, L" \x02 ~woof~\x5455 " );
406
+
407
+ putV3F1000 (&buf, v3f (500 , 10024 .2f , -192 .54f ));
408
+ putARGB8 (&buf, video::SColor (255 , 128 , 50 , 128 ));
409
+
410
+ putLongString (&buf, " some longer string here" );
411
+
412
+ putU16 (&buf, 0xF00D );
413
+
414
+ UASSERT (buf.size () == sizeof (test_serialized_data));
415
+ UASSERT (!memcmp (&buf[0 ], test_serialized_data, sizeof (test_serialized_data)));
416
+ }
417
+
418
+
419
+ void TestSerialization::testStringLengthLimits ()
420
+ {
421
+ std::vector<u8> buf;
422
+ std::string too_long (STRING_MAX_LEN + 1 , ' A' );
423
+ std::string way_too_large (LONG_STRING_MAX_LEN + 1 , ' B' );
424
+ std::wstring too_long_wide (WIDE_STRING_MAX_LEN + 1 , L' C' );
425
+
426
+ EXCEPTION_CHECK (SerializationError, putString (&buf, too_long));
427
+
428
+ putLongString (&buf, too_long);
429
+ too_long.resize (too_long.size () - 1 );
430
+ putString (&buf, too_long);
431
+
432
+ EXCEPTION_CHECK (SerializationError, putWideString (&buf, too_long_wide));
433
+ too_long_wide.resize (too_long_wide.size () - 1 );
434
+ putWideString (&buf, too_long_wide);
435
+ }
436
+
437
+
438
+ void TestSerialization::testBufReader ()
439
+ {
440
+ u8 u8_data;
441
+ u16 u16_data;
442
+ u32 u32_data;
443
+ u64 u64_data;
444
+ s8 s8_data;
445
+ s16 s16_data;
446
+ s32 s32_data;
447
+ s64 s64_data;
448
+ f32 f32_data, f32_data2, f32_data3, f32_data4;
449
+ video::SColor scolor_data;
450
+ v2s16 v2s16_data;
451
+ v3s16 v3s16_data;
452
+ v2s32 v2s32_data;
453
+ v3s32 v3s32_data;
454
+ v2f v2f_data;
455
+ v3f v3f_data;
456
+ std::string string_data;
457
+ std::wstring widestring_data;
458
+ std::string longstring_data;
459
+ u8 raw_data[10 ] = {0 };
460
+
461
+ BufReader buf (test_serialized_data, sizeof (test_serialized_data));
462
+
463
+ // Try reading data like normal
464
+ UASSERT (buf.getU8 () == 0x11 );
465
+ UASSERT (buf.getU16 () == 0x2233 );
466
+ UASSERT (buf.getU32 () == 0x44556677 );
467
+ UASSERT (buf.getU64 () == 0x8899AABBCCDDEEFF );
468
+ UASSERT (buf.getS8 () == -128 );
469
+ UASSERT (buf.getS16 () == 30000 );
470
+ UASSERT (buf.getS32 () == -6 );
471
+ UASSERT (buf.getS64 () == -43 );
472
+ UASSERT (buf.getF1000 () == 53 .534f );
473
+ UASSERT (buf.getF1000 () == -300000 .32f );
474
+ UASSERT (buf.getF1000 () == F1000_MIN);
475
+ UASSERT (buf.getF1000 () == F1000_MAX);
476
+ UASSERT (buf.getString () == " foobar!" );
477
+ UASSERT (buf.getV2S16 () == v2s16 (500 , 500 ));
478
+ UASSERT (buf.getV3S16 () == v3s16 (4207 , 604 , -30 ));
479
+ UASSERT (buf.getV2S32 () == v2s32 (1920 , 1080 ));
480
+ UASSERT (buf.getV3S32 () == v3s32 (-400 , 6400054 , 290549855 ));
481
+ UASSERT (buf.getV2F1000 () == v2f (500 .656f , 350 .345f ));
482
+ UASSERT (buf.getWideString () == L" \x02 ~woof~\x5455 " );
483
+ UASSERT (buf.getV3F1000 () == v3f (500 , 10024 .2f , -192 .54f ));
484
+ UASSERT (buf.getARGB8 () == video::SColor (255 , 128 , 50 , 128 ));
485
+ UASSERT (buf.getLongString () == " some longer string here" );
486
+
487
+ // Verify the offset and data is unchanged after a failed read
488
+ size_t orig_pos = buf.pos ;
489
+ u32_data = 0 ;
490
+ UASSERT (buf.getU32NoEx (&u32_data) == false );
491
+ UASSERT (buf.pos == orig_pos);
492
+ UASSERT (u32_data == 0 );
493
+
494
+ // Now try the same for a failed string read
495
+ UASSERT (buf.getStringNoEx (&string_data) == false );
496
+ UASSERT (buf.pos == orig_pos);
497
+ UASSERT (string_data == " " );
498
+
499
+ // Now try the same for a failed string read
500
+ UASSERT (buf.getWideStringNoEx (&widestring_data) == false );
501
+ UASSERT (buf.pos == orig_pos);
502
+ UASSERT (widestring_data == L" " );
503
+
504
+ UASSERT (buf.getU16 () == 0xF00D );
505
+
506
+ UASSERT (buf.remaining () == 0 );
507
+
508
+ // Check to make sure these each blow exceptions as they're supposed to
509
+ EXCEPTION_CHECK (SerializationError, buf.getU8 ());
510
+ EXCEPTION_CHECK (SerializationError, buf.getU16 ());
511
+ EXCEPTION_CHECK (SerializationError, buf.getU32 ());
512
+ EXCEPTION_CHECK (SerializationError, buf.getU64 ());
513
+
514
+ EXCEPTION_CHECK (SerializationError, buf.getS8 ());
515
+ EXCEPTION_CHECK (SerializationError, buf.getS16 ());
516
+ EXCEPTION_CHECK (SerializationError, buf.getS32 ());
517
+ EXCEPTION_CHECK (SerializationError, buf.getS64 ());
518
+
519
+ EXCEPTION_CHECK (SerializationError, buf.getF1000 ());
520
+ EXCEPTION_CHECK (SerializationError, buf.getARGB8 ());
521
+
522
+ EXCEPTION_CHECK (SerializationError, buf.getV2S16 ());
523
+ EXCEPTION_CHECK (SerializationError, buf.getV3S16 ());
524
+ EXCEPTION_CHECK (SerializationError, buf.getV2S32 ());
525
+ EXCEPTION_CHECK (SerializationError, buf.getV3S32 ());
526
+ EXCEPTION_CHECK (SerializationError, buf.getV2F1000 ());
527
+ EXCEPTION_CHECK (SerializationError, buf.getV3F1000 ());
528
+
529
+ EXCEPTION_CHECK (SerializationError, buf.getString ());
530
+ EXCEPTION_CHECK (SerializationError, buf.getWideString ());
531
+ EXCEPTION_CHECK (SerializationError, buf.getLongString ());
532
+ EXCEPTION_CHECK (SerializationError,
533
+ buf.getRawData (raw_data, sizeof (raw_data)));
534
+
535
+ // See if we can skip backwards
536
+ buf.pos = 5 ;
537
+ UASSERT (buf.getRawDataNoEx (raw_data, 3 ) == true );
538
+ UASSERT (raw_data[0 ] == 0x66 );
539
+ UASSERT (raw_data[1 ] == 0x77 );
540
+ UASSERT (raw_data[2 ] == 0x88 );
541
+
542
+ UASSERT (buf.getU32 () == 0x99AABBCC );
543
+ UASSERT (buf.pos == 12 );
544
+
545
+ // Now let's try it all over again using the NoEx variants
546
+ buf.pos = 0 ;
547
+
548
+ UASSERT (buf.getU8NoEx (&u8_data));
549
+ UASSERT (buf.getU16NoEx (&u16_data));
550
+ UASSERT (buf.getU32NoEx (&u32_data));
551
+ UASSERT (buf.getU64NoEx (&u64_data));
552
+
553
+ UASSERT (buf.getS8NoEx (&s8_data));
554
+ UASSERT (buf.getS16NoEx (&s16_data));
555
+ UASSERT (buf.getS32NoEx (&s32_data));
556
+ UASSERT (buf.getS64NoEx (&s64_data));
557
+
558
+ UASSERT (buf.getF1000NoEx (&f32_data));
559
+ UASSERT (buf.getF1000NoEx (&f32_data2));
560
+ UASSERT (buf.getF1000NoEx (&f32_data3));
561
+ UASSERT (buf.getF1000NoEx (&f32_data4));
562
+
563
+ UASSERT (buf.getStringNoEx (&string_data));
564
+ UASSERT (buf.getV2S16NoEx (&v2s16_data));
565
+ UASSERT (buf.getV3S16NoEx (&v3s16_data));
566
+ UASSERT (buf.getV2S32NoEx (&v2s32_data));
567
+ UASSERT (buf.getV3S32NoEx (&v3s32_data));
568
+ UASSERT (buf.getV2F1000NoEx (&v2f_data));
569
+ UASSERT (buf.getWideStringNoEx (&widestring_data));
570
+ UASSERT (buf.getV3F1000NoEx (&v3f_data));
571
+ UASSERT (buf.getARGB8NoEx (&scolor_data));
572
+
573
+ UASSERT (buf.getLongStringNoEx (&longstring_data));
574
+
575
+ // and make sure we got the correct data
576
+ UASSERT (u8_data == 0x11 );
577
+ UASSERT (u16_data == 0x2233 );
578
+ UASSERT (u32_data == 0x44556677 );
579
+ UASSERT (u64_data == 0x8899AABBCCDDEEFF );
580
+ UASSERT (s8_data == -128 );
581
+ UASSERT (s16_data == 30000 );
582
+ UASSERT (s32_data == -6 );
583
+ UASSERT (s64_data == -43 );
584
+ UASSERT (f32_data == 53 .534f );
585
+ UASSERT (f32_data2 == -300000 .32f );
586
+ UASSERT (f32_data3 == F1000_MIN);
587
+ UASSERT (f32_data4 == F1000_MAX);
588
+ UASSERT (string_data == " foobar!" );
589
+ UASSERT (v2s16_data == v2s16 (500 , 500 ));
590
+ UASSERT (v3s16_data == v3s16 (4207 , 604 , -30 ));
591
+ UASSERT (v2s32_data == v2s32 (1920 , 1080 ));
592
+ UASSERT (v3s32_data == v3s32 (-400 , 6400054 , 290549855 ));
593
+ UASSERT (v2f_data == v2f (500 .656f , 350 .345f ));
594
+ UASSERT (widestring_data == L" \x02 ~woof~\x5455 " );
595
+ UASSERT (v3f_data == v3f (500 , 10024 .2f , -192 .54f ));
596
+ UASSERT (scolor_data == video::SColor (255 , 128 , 50 , 128 ));
597
+ UASSERT (longstring_data == " some longer string here" );
598
+
599
+ UASSERT (buf.remaining () == 2 );
600
+ UASSERT (buf.getRawDataNoEx (raw_data, 3 ) == false );
601
+ UASSERT (buf.remaining () == 2 );
602
+ UASSERT (buf.getRawDataNoEx (raw_data, 2 ) == true );
603
+ UASSERT (raw_data[0 ] == 0xF0 );
604
+ UASSERT (raw_data[1 ] == 0x0D );
605
+ UASSERT (buf.remaining () == 0 );
606
+
607
+ // Make sure no more available data causes a failure
608
+ UASSERT (!buf.getU8NoEx (&u8_data));
609
+ UASSERT (!buf.getU16NoEx (&u16_data));
610
+ UASSERT (!buf.getU32NoEx (&u32_data));
611
+ UASSERT (!buf.getU64NoEx (&u64_data));
612
+
613
+ UASSERT (!buf.getS8NoEx (&s8_data));
614
+ UASSERT (!buf.getS16NoEx (&s16_data));
615
+ UASSERT (!buf.getS32NoEx (&s32_data));
616
+ UASSERT (!buf.getS64NoEx (&s64_data));
617
+
618
+ UASSERT (!buf.getF1000NoEx (&f32_data));
619
+ UASSERT (!buf.getARGB8NoEx (&scolor_data));
620
+
621
+ UASSERT (!buf.getV2S16NoEx (&v2s16_data));
622
+ UASSERT (!buf.getV3S16NoEx (&v3s16_data));
623
+ UASSERT (!buf.getV2S32NoEx (&v2s32_data));
624
+ UASSERT (!buf.getV3S32NoEx (&v3s32_data));
625
+ UASSERT (!buf.getV2F1000NoEx (&v2f_data));
626
+ UASSERT (!buf.getV3F1000NoEx (&v3f_data));
627
+
628
+ UASSERT (!buf.getStringNoEx (&string_data));
629
+ UASSERT (!buf.getWideStringNoEx (&widestring_data));
630
+ UASSERT (!buf.getLongStringNoEx (&longstring_data));
631
+ UASSERT (!buf.getRawDataNoEx (raw_data, sizeof (raw_data)));
632
+ }
633
+
634
+
372
635
const u8 TestSerialization::test_serialized_data[12 * 13 ] = {
373
636
0x11 , 0x22 , 0x33 , 0x44 , 0x55 , 0x66 , 0x77 , 0x88 , 0x99 , 0xaa , 0xbb , 0xcc ,
374
637
0xdd , 0xee , 0xff , 0x80 , 0x75 , 0x30 , 0xff , 0xff , 0xff , 0xfa , 0xff , 0xff ,
0 commit comments