From 710bf4f9e419204150468f36ec15773ddd43ed8c Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Tue, 29 Jul 2014 12:23:13 +0000 Subject: [PATCH] Add tests for 32bit varints encoding git-svn-id: http://svn.osgeo.org/postgis/trunk@12838 b70326c6-7e19-0410-871a-916f4a2858ee --- liblwgeom/cunit/cu_varint.c | 96 +++++++++++++++++++++++++++++++------ 1 file changed, 81 insertions(+), 15 deletions(-) diff --git a/liblwgeom/cunit/cu_varint.c b/liblwgeom/cunit/cu_varint.c index b873923c8..993015a16 100644 --- a/liblwgeom/cunit/cu_varint.c +++ b/liblwgeom/cunit/cu_varint.c @@ -23,6 +23,26 @@ #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"); + + } -- 2.49.0