Path: blob/main/contrib/libcbor/test/float_ctrl_encoders_test.c
39535 views
/*1* Copyright (c) 2014-2020 Pavel Kalvoda <[email protected]>2*3* libcbor is free software; you can redistribute it and/or modify4* it under the terms of the MIT license. See LICENSE for details.5*/67#include <math.h>8#include "assertions.h"9#include "cbor.h"1011unsigned char buffer[512];1213static void test_bools(void **_CBOR_UNUSED(_state)) {14assert_size_equal(1, cbor_encode_bool(false, buffer, 512));15assert_memory_equal(buffer, ((unsigned char[]){0xF4}), 1);16assert_size_equal(1, cbor_encode_bool(true, buffer, 512));17assert_memory_equal(buffer, ((unsigned char[]){0xF5}), 1);18}1920static void test_null(void **_CBOR_UNUSED(_state)) {21assert_size_equal(1, cbor_encode_null(buffer, 512));22assert_memory_equal(buffer, ((unsigned char[]){0xF6}), 1);23}2425static void test_undef(void **_CBOR_UNUSED(_state)) {26assert_size_equal(1, cbor_encode_undef(buffer, 512));27assert_memory_equal(buffer, ((unsigned char[]){0xF7}), 1);28}2930static void test_break(void **_CBOR_UNUSED(_state)) {31assert_size_equal(1, cbor_encode_break(buffer, 512));32assert_memory_equal(buffer, ((unsigned char[]){0xFF}), 1);33}3435/* Check that encode(decode(buffer)) = buffer for a valid half-float in the36* buffer.*/37static void assert_half_float_codec_identity(void) {38unsigned char secondary_buffer[3];39struct cbor_load_result res;40// Load and check data in buffer41cbor_item_t *half_float = cbor_load(buffer, 3, &res);42assert_size_equal(res.error.code, CBOR_ERR_NONE);43assert_true(cbor_isa_float_ctrl(half_float));44assert_true(cbor_is_float(half_float));45assert_size_equal(cbor_float_get_width(half_float), CBOR_FLOAT_16);46// Encode again and check equality47assert_size_equal(3, cbor_encode_half(cbor_float_get_float2(half_float),48secondary_buffer, 3));49assert_memory_equal(buffer, secondary_buffer, 3);50cbor_decref(&half_float);51}5253static void test_half(void **_CBOR_UNUSED(_state)) {54assert_size_equal(3, cbor_encode_half(1.5f, buffer, 512));55assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0x3E, 0x00}), 3);56assert_half_float_codec_identity();5758assert_size_equal(3, cbor_encode_half(-0.0f, buffer, 512));59assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0x80, 0x00}), 3);60assert_half_float_codec_identity();6162assert_size_equal(3, cbor_encode_half(0.0f, buffer, 512));63assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0x00, 0x00}), 3);64assert_half_float_codec_identity();6566assert_size_equal(3, cbor_encode_half(65504.0f, buffer, 512));67assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0x7B, 0xFF}), 3);68assert_half_float_codec_identity();6970assert_size_equal(3, cbor_encode_half(0.00006103515625f, buffer, 512));71assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0x04, 0x00}), 3);72assert_half_float_codec_identity();7374assert_size_equal(3, cbor_encode_half(-4.0f, buffer, 512));75assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0xC4, 0x00}), 3);76assert_half_float_codec_identity();7778/* Smallest representable value */79assert_size_equal(3, cbor_encode_half(5.960464477539063e-8f, buffer, 512));80assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0x00, 0x01}), 3);81assert_half_float_codec_identity();8283/* Smaller than the smallest, approximate magnitude representation */84assert_size_equal(3, cbor_encode_half(5.960464477539062e-8f, buffer, 512));85assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0x00, 0x01}), 3);86assert_half_float_codec_identity();8788assert_size_equal(3, cbor_encode_half(4.172325134277344e-7f, buffer, 512));89assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0x00, 0x07}), 3);90assert_half_float_codec_identity();9192assert_size_equal(3, cbor_encode_half(6.097555160522461e-5f, buffer, 512));93assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0x03, 0xff}), 3);94assert_half_float_codec_identity();9596assert_size_equal(3, cbor_encode_half(6.100535392761231e-5f, buffer, 512));97assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0x04, 0x00}), 3);98assert_half_float_codec_identity();99100/* Smaller than the smallest and even the magnitude cannot be represented,101round off to zero */102assert_size_equal(3, cbor_encode_half(1e-25f, buffer, 512));103assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0x00, 0x00}), 3);104assert_half_float_codec_identity();105106assert_size_equal(3, cbor_encode_half(1.1920928955078125e-7, buffer, 512));107assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0x00, 0x02}), 3);108assert_half_float_codec_identity();109110assert_size_equal(3, cbor_encode_half(-1.1920928955078124e-7, buffer, 512));111assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0x80, 0x02}), 3);112assert_half_float_codec_identity();113114assert_size_equal(3, cbor_encode_half(INFINITY, buffer, 512));115assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0x7C, 0x00}), 3);116assert_half_float_codec_identity();117}118119static void test_half_special(void **_CBOR_UNUSED(_state)) {120assert_size_equal(3, cbor_encode_half(NAN, buffer, 512));121assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0x7E, 0x00}), 3);122assert_half_float_codec_identity();123124// We discard all information bits in half-float NaNs. This is125// not required for the core CBOR protocol (it is only a suggestion in126// Section 3.9).127// See https://github.com/PJK/libcbor/issues/215128assert_size_equal(3, cbor_encode_half(nanf("2"), buffer, 512));129assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0x7E, 0x00}), 3);130assert_half_float_codec_identity();131}132133static void test_half_infinity(void **_CBOR_UNUSED(_state)) {134assert_size_equal(3, cbor_encode_half(INFINITY, buffer, 512));135assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0x7C, 0x00}), 3);136assert_half_float_codec_identity();137138assert_size_equal(3, cbor_encode_half(-INFINITY, buffer, 512));139assert_memory_equal(buffer, ((unsigned char[]){0xF9, 0xFC, 0x00}), 3);140assert_half_float_codec_identity();141}142143static void test_float(void **_CBOR_UNUSED(_state)) {144assert_size_equal(5, cbor_encode_single(3.4028234663852886e+38, buffer, 512));145assert_memory_equal(buffer, ((unsigned char[]){0xFA, 0x7F, 0x7F, 0xFF, 0xFF}),1465);147148assert_size_equal(5, cbor_encode_single(NAN, buffer, 512));149assert_memory_equal(buffer, ((unsigned char[]){0xFA, 0x7F, 0xC0, 0x00, 0x00}),1505);151152#ifndef _WIN32153// TODO: https://github.com/PJK/libcbor/issues/271154assert_size_equal(5, cbor_encode_single(nanf("3"), buffer, 512));155assert_memory_equal(buffer, ((unsigned char[]){0xFA, 0x7F, 0xC0, 0x00, 0x03}),1565);157#endif158159assert_size_equal(5, cbor_encode_single(strtof("Inf", NULL), buffer, 512));160assert_memory_equal(buffer, ((unsigned char[]){0xFA, 0x7F, 0x80, 0x00, 0x00}),1615);162163assert_size_equal(5, cbor_encode_single(strtof("-Inf", NULL), buffer, 512));164assert_memory_equal(buffer, ((unsigned char[]){0xFA, 0xFF, 0x80, 0x00, 0x00}),1655);166}167168static void test_double(void **_CBOR_UNUSED(_state)) {169assert_size_equal(9, cbor_encode_double(1.0e+300, buffer, 512));170assert_memory_equal(171buffer,172((unsigned char[]){0xFB, 0x7E, 0x37, 0xE4, 0x3C, 0x88, 0x00, 0x75, 0x9C}),1739);174175assert_size_equal(9, cbor_encode_double(nan(""), buffer, 512));176assert_memory_equal(177buffer,178((unsigned char[]){0xFB, 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}),1799);180181#ifndef _WIN32182// TODO: https://github.com/PJK/libcbor/issues/271183assert_size_equal(9, cbor_encode_double(nan("3"), buffer, 512));184assert_memory_equal(185buffer,186((unsigned char[]){0xFB, 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03}),1879);188#endif189190assert_size_equal(9, cbor_encode_double(strtod("Inf", NULL), buffer, 512));191assert_memory_equal(192buffer,193((unsigned char[]){0xFB, 0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}),1949);195196assert_size_equal(9, cbor_encode_double(strtod("-Inf", NULL), buffer, 512));197assert_memory_equal(198buffer,199((unsigned char[]){0xFB, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}),2009);201}202203int main(void) {204const struct CMUnitTest tests[] = {205cmocka_unit_test(test_bools), cmocka_unit_test(test_null),206cmocka_unit_test(test_undef), cmocka_unit_test(test_break),207cmocka_unit_test(test_half), cmocka_unit_test(test_float),208cmocka_unit_test(test_double), cmocka_unit_test(test_half_special),209cmocka_unit_test(test_half_infinity),210};211return cmocka_run_group_tests(tests, NULL, NULL);212}213214215