]> granicus.if.org Git - postgis/commitdiff
Add tests for 32bit varints encoding
authorSandro Santilli <strk@keybit.net>
Tue, 29 Jul 2014 12:23:13 +0000 (12:23 +0000)
committerSandro Santilli <strk@keybit.net>
Tue, 29 Jul 2014 12:23:13 +0000 (12:23 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@12838 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/cunit/cu_varint.c

index b873923c819896a7b8b240abd3cc8f568aa7a907..993015a16daf9e412ab9e480e5364a093d4d8401 100644 (file)
 #include "varint.h"
 #include "cu_tester.h"
 
+static void do_test_u32_varint(uint32_t nr,int expected_size, char* expected_res)
+{
+       uint8_t buf[8]; 
+       int size;
+       char *hex;
+       
+       size = varint_u32_encoded_size(nr);
+       if ( size != expected_size ) {
+         printf("Expected: %d\nObtained: %d\n", expected_size, size);
+       }
+       CU_ASSERT_EQUAL(size,expected_size);
+       varint_u32_encode_buf(nr, buf);
+       hex = hexbytes_from_bytes(buf,size);
+       if ( strcmp(hex,expected_res) ) {
+         printf("Expected: %s\nObtained: %s\n", expected_res, hex);
+       }
+       CU_ASSERT_STRING_EQUAL(hex, expected_res);      
+  lwfree(hex);
+}
+
 static void do_test_s32_varint(int32_t nr,int expected_size, char* expected_res)
 {
        uint8_t buf[8]; 
@@ -30,12 +50,15 @@ static void do_test_s32_varint(int32_t nr,int expected_size, char* expected_res)
        char *hex;
        
        size = varint_s32_encoded_size(nr);
+       if ( size != expected_size ) {
+         printf("Expected: %d\nObtained: %d\n", expected_size, size);
+       }
        CU_ASSERT_EQUAL(size,expected_size);
        varint_s32_encode_buf(nr, buf);
        hex = hexbytes_from_bytes(buf,size);
-  if ( strcmp(hex,expected_res) ) {
-    printf("Expected: %s\nObtained: %s\n", expected_res, hex);
-  }
+       if ( strcmp(hex,expected_res) ) {
+         printf("Expected: %s\nObtained: %s\n", expected_res, hex);
+       }
        CU_ASSERT_STRING_EQUAL(hex, expected_res);      
   lwfree(hex);
 }
@@ -47,12 +70,15 @@ static void do_test_u64_varint(uint64_t nr,int expected_size, char* expected_res
        char *hex;
        
        size = varint_u64_encoded_size(nr);
+       if ( size != expected_size ) {
+         printf("Expected: %d\nObtained: %d\n", expected_size, size);
+       }
        CU_ASSERT_EQUAL(size,expected_size);
        varint_u64_encode_buf(nr, buf);
        hex = hexbytes_from_bytes(buf,size);
-  if ( strcmp(hex,expected_res) ) {
-    printf("Expected: %s\nObtained: %s\n", expected_res, hex);
-  }
+       if ( strcmp(hex,expected_res) ) {
+         printf("Expected: %s\nObtained: %s\n", expected_res, hex);
+       }
        CU_ASSERT_STRING_EQUAL(hex, expected_res);      
   lwfree(hex);
 }
@@ -64,12 +90,15 @@ static void do_test_s64_varint(int64_t nr,int expected_size, char* expected_res)
        char *hex;
        
        size = varint_s64_encoded_size(nr);
+       if ( size != expected_size ) {
+         printf("Expected: %d\nObtained: %d\n", expected_size, size);
+       }
        CU_ASSERT_EQUAL(size,expected_size);
        varint_s64_encode_buf(nr, buf);
        hex = hexbytes_from_bytes(buf,size);
-  if ( strcmp(hex,expected_res) ) {
-    printf("Expected: %s\nObtained: %s\n", expected_res, hex);
-  }
+       if ( strcmp(hex,expected_res) ) {
+         printf("Expected: %s\nObtained: %s\n", expected_res, hex);
+       }
        CU_ASSERT_STRING_EQUAL(hex, expected_res);      
   lwfree(hex);
 }
@@ -80,16 +109,53 @@ static void test_varint(void)
        do_test_u64_varint(1, 1, "01");
        do_test_u64_varint(300, 2, "AC02");
        do_test_u64_varint(150, 2, "9601");
-       
+       do_test_u64_varint(240, 2, "F001"); 
+       do_test_u64_varint(0x4000, 3, "808001");
+  /*
+                0100:0000 0000:0000 - input (0x4000)
+      1000:0000 1000:0000 0000:0001 - output (0x808001)
+       000:0000  000:0000  000:0001 - chop
+       000:0001  000:0000  000:0000 - swap
+         0:0000 0100:0000 0000:0000 - concat = input
+   */
+       do_test_u64_varint(2147483647, 5, "FFFFFFFF07");
+  /*
+              0111:1111 1111:1111 1111:1111 1111:1111 - input (0x7FFFFFFF)
+    1111:1111 1111:1111 1111:1111 1111:1111 0000:0111 - output(0xFFFFFFFF07)
+     111:1111  111:1111  111:1111  111:1111  000:0111 - chop
+     000:0111  111:1111  111:1111  111:1111  111:1111 - swap
+              0111:1111 1111:1111 1111:1111 1111:1111 - concat = input
+                      |         |         |         |
+                   2^32      2^16       2^8       2^0
+   */
        do_test_s64_varint(1, 1, "02");
        do_test_s64_varint(-1, 1, "01");
        do_test_s64_varint(-2, 1, "03");
-#if 0 /* FIXME! */
-       do_test_s64_varint(2147483647, 4, "FFFFFFFE");
-       do_test_s64_varint(-2147483648, 4, "FFFFFFFF");
-#endif
 
-       /* TODO: test signed/unsigned 32bit varints */
+       do_test_u32_varint(2147483647, 5, "FFFFFFFF07");
+  /*
+              0111:1111 1111:1111 1111:1111 1111:1111 - input (7fffffff)
+    1111:1111 1111:1111 1111:1111 1111:1111 0000:0111 - output (ffffff07)
+     111:1111  111:1111  111:1111  111:1111  000:0111 - chop
+     000:0111  111:1111  111:1111  111:1111  111:1111 - swap
+              0111:1111 1111:1111 1111:1111 1111:1111 - concat = input
+                      |         |         |         |
+                   2^32      2^16       2^8       2^0
+   */
+       do_test_s32_varint(2147483647, 5, "FEFFFFFF0F");
+  /*
+              0111:1111 1111:1111 1111:1111 1111:1111 - input (7fffffff)
+    1111:1110 1111:1111 1111:1111 1111:1111 0000:1111 - output(feffffff0f)
+    1111:1111 1111:1111 1111:1111 1111:1111 0000:0111 - zigzag (ffffff07)
+     111:1111  111:1111  111:1111  111:1111  000:0111 - chop
+     000:0111  111:1111  111:1111  111:1111  111:1111 - swap
+              0111:1111 1111:1111 1111:1111 1111:1111 - concat = input
+                      |         |         |         |
+                   2^32      2^16       2^8       2^0
+   */
+       do_test_s32_varint(-2147483648, 5, "FFFFFFFF0F");
+
+
 }