/*
 * Copyright (c) 2018 Nordic Semiconductor ASA
 * Copyright (c) 2015 Runtime Inc
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include "settings_test.h"

void test_config_getset_int64(void)
{
	char name[80];
	char tmp[64];
	int rc;
	s64_t new_val64;

	new_val64 = 0x8012345678901234;
	strcpy(name, "myfoo/mybar64");
	rc = settings_runtime_set(name, &new_val64, sizeof(s64_t));
	zassert_true(rc == 0, "can't set value");
	zassert_true(test_set_called == 1, "the SET handler wasn't called");
	zassert_equal(val64, 0x8012345678901234,
		     "SET handler: was called with wrong parameters");
	ctest_clear_call_state();

	strcpy(name, "myfoo/mybar64");
	rc = settings_runtime_get(name, tmp, sizeof(tmp));
	zassert_equal(rc, sizeof(s64_t), "the key value should been available");
	zassert_true(test_get_called == 1, "the GET handler wasn't called");
	memcpy(&new_val64, tmp, sizeof(s64_t));
	zassert_equal(new_val64, 0x8012345678901234,
		      "unexpected value fetched %d", tmp);
	ctest_clear_call_state();

	new_val64 = 1;
	strcpy(name, "myfoo/mybar64");
	rc = settings_runtime_set(name, &new_val64, sizeof(s64_t));
	zassert_true(rc == 0, "can't set value");
	zassert_true(test_set_called == 1, "the SET handler wasn't called");
	zassert_equal(val64, 1,
		     "SET handler: was called with wrong parameters");
	ctest_clear_call_state();

	strcpy(name, "myfoo/mybar64");
	rc = settings_runtime_get(name, tmp, sizeof(tmp));
	zassert_equal(rc, sizeof(s64_t), "the key value should been available");
	zassert_true(test_get_called == 1, "the GET handler wasn't called");
	memcpy(&new_val64, tmp, sizeof(s64_t));
	zassert_equal(new_val64, 1,
		      "unexpected value fetched %d", tmp);
	ctest_clear_call_state();
}
