#include "CppUTest/TestHarness.h"
#include "CppUTest/CommandLineTestRunner.h"

#include "btstack_util.h"
#include "btstack_config.h"
#include <stdio.h>

static bool assert_failed;

void test_assert(bool condition){
    if (condition != true){
        assert_failed = true;
    }
}

static void CHECK_EQUAL_ARRAY(uint8_t * expected, uint8_t * actual, int size){
	int i;
	for (i=0; i<size; i++){
		if (expected[i] != actual[i]) {
			printf("offset %u wrong\n", i);
			printf("expected: "); printf_hexdump(expected, size);
			printf("actual:   "); printf_hexdump(actual, size);
		}
		BYTES_EQUAL(expected[i], actual[i]);
	}
}

TEST_GROUP(btstack_util){
    char buffer[8];
    void setup(void){
        assert_failed = false;
    }
};

TEST(btstack_util, btstack_printf_strlen){
    CHECK_EQUAL(4, btstack_printf_strlen("%04x", 0x1234));
}

TEST(btstack_util, btstack_snprintf_assert_complete_ok){
    uint16_t len = btstack_snprintf_assert_complete(buffer, sizeof(buffer), "%04x", 0x1234);
    CHECK_EQUAL(4, len);
    CHECK_EQUAL_ARRAY((uint8_t*) "1234", (uint8_t*) buffer, 4);
}

TEST(btstack_util, btstack_snprintf_assert_complete_too_long){
    (void) btstack_snprintf_assert_complete(buffer, sizeof(buffer), "%08x", 0x1234);
    CHECK_TRUE(assert_failed);
}

TEST(btstack_util, btstack_snprintf_best_effort_complete){
    uint16_t len = btstack_snprintf_best_effort(buffer, sizeof(buffer), "%04x", 0x1234);
    CHECK_EQUAL(4, len);
    CHECK_EQUAL_ARRAY((uint8_t*) "1234", (uint8_t*) buffer, 4);
}

TEST(btstack_util, btstack_snprintf_best_effort_incomplete){
    uint16_t len = btstack_snprintf_best_effort(buffer, sizeof(buffer), "%08x", 0x1234);
    CHECK_EQUAL(7, len);
    CHECK_EQUAL_ARRAY((uint8_t*) "0000000", (uint8_t*) buffer, 4);
}

int main (int argc, const char * argv[]){
    return CommandLineTestRunner::RunAllTests(argc, argv);
}