/* $Id: wi-runtime-tests.c 4797 2007-05-27 21:48:49Z morris $ */
/*
* Copyright (c) 2007 Axel Andersson
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <wired/wired.h>
WI_TEST_EXPORT void wi_test_runtime_initialize(void);
WI_TEST_EXPORT void wi_test_runtime_info(void);
WI_TEST_EXPORT void wi_test_runtime_functions(void);
WI_TEST_EXPORT void wi_test_runtime_pool(void);
WI_TEST_EXPORT void wi_test_runtime_retain(void);
struct _wi_runtimetest {
wi_runtime_base_t base;
wi_uinteger_t value;
};
typedef struct _wi_runtimetest _wi_runtimetest_t;
static _wi_runtimetest_t * _wi_runtimetest_alloc(void);
static _wi_runtimetest_t * _wi_runtimetest_init_with_value(_wi_runtimetest_t *, wi_uinteger_t);
static void _wi_runtimetest_dealloc(wi_runtime_instance_t *);
static wi_runtime_instance_t * _wi_runtimetest_copy(wi_runtime_instance_t *);
static wi_boolean_t _wi_runtimetest_is_equal(wi_runtime_instance_t *, wi_runtime_instance_t *);
static wi_hash_code_t _wi_runtimetest_hash(wi_runtime_instance_t *);
static wi_string_t * _wi_runtimetest_description(wi_runtime_instance_t *);
static wi_uinteger_t _wi_runtimetest_deallocs;
static wi_runtime_id_t _wi_runtimetest_runtime_id = WI_RUNTIME_ID_NULL;
static wi_runtime_class_t _wi_runtimetest_runtime_class = {
"_wi_runtimetest_t",
_wi_runtimetest_dealloc,
_wi_runtimetest_copy,
_wi_runtimetest_is_equal,
_wi_runtimetest_description,
_wi_runtimetest_hash
};
void wi_test_runtime_initialize(void) {
_wi_runtimetest_runtime_id = wi_runtime_register_class(&_wi_runtimetest_runtime_class);
}
#pragma mark -
static _wi_runtimetest_t * _wi_runtimetest_alloc(void) {
return wi_runtime_create_instance(_wi_runtimetest_runtime_id, sizeof(_wi_runtimetest_t));
}
static _wi_runtimetest_t * _wi_runtimetest_init_with_value(_wi_runtimetest_t *runtimetest, wi_uinteger_t value) {
runtimetest->value = value;
return runtimetest;
}
static void _wi_runtimetest_dealloc(wi_runtime_instance_t *instance) {
_wi_runtimetest_deallocs++;
}
static wi_runtime_instance_t * _wi_runtimetest_copy(wi_runtime_instance_t *instance) {
_wi_runtimetest_t *runtimetest = instance;
return _wi_runtimetest_init_with_value(_wi_runtimetest_alloc(), runtimetest->value);
}
static wi_boolean_t _wi_runtimetest_is_equal(wi_runtime_instance_t *instance1, wi_runtime_instance_t *instance2) {
_wi_runtimetest_t *runtimetest1 = instance1;
_wi_runtimetest_t *runtimetest2 = instance2;
return (runtimetest1->value == runtimetest2->value);
}
static wi_hash_code_t _wi_runtimetest_hash(wi_runtime_instance_t *instance) {
_wi_runtimetest_t *runtimetest = instance;
return runtimetest->value;
}
static wi_string_t * _wi_runtimetest_description(wi_runtime_instance_t *instance) {
_wi_runtimetest_t *runtimetest = instance;
return wi_string_with_format(WI_STR("value=%lu"), runtimetest->value);
}
#pragma mark -
void wi_test_runtime_info(void) {
_wi_runtimetest_t *runtimetest;
WI_TEST_ASSERT_EQUALS(wi_runtime_class_with_name(WI_STR("_wi_runtimetest_t")), &_wi_runtimetest_runtime_class, "");
WI_TEST_ASSERT_EQUALS(wi_runtime_class_with_id(_wi_runtimetest_runtime_id), &_wi_runtimetest_runtime_class, "");
runtimetest = _wi_runtimetest_init_with_value(_wi_runtimetest_alloc(), 42);
WI_TEST_ASSERT_EQUALS(wi_runtime_id(runtimetest), _wi_runtimetest_runtime_id, "");
WI_TEST_ASSERT_EQUALS(wi_runtime_class(runtimetest), &_wi_runtimetest_runtime_class, "");
WI_TEST_ASSERT_EQUAL_INSTANCES(wi_runtime_class_name(runtimetest), wi_string_with_cstring(_wi_runtimetest_runtime_class.name), "");
wi_release(runtimetest);
}
void wi_test_runtime_functions(void) {
_wi_runtimetest_t *runtimetest, *runtimetest2;
_wi_runtimetest_deallocs = 0;
runtimetest = _wi_runtimetest_init_with_value(_wi_runtimetest_alloc(), 42);
runtimetest2 = wi_copy(runtimetest);
WI_TEST_ASSERT_TRUE(runtimetest != runtimetest2, "");
WI_TEST_ASSERT_EQUALS(runtimetest->value, runtimetest2->value, "");
WI_TEST_ASSERT_TRUE(wi_is_equal(runtimetest, runtimetest2), "");
runtimetest2->value++;
WI_TEST_ASSERT_FALSE(wi_is_equal(runtimetest, runtimetest2), "");
wi_release(runtimetest2);
WI_TEST_ASSERT_EQUALS(_wi_runtimetest_deallocs, 1U, "");
WI_TEST_ASSERT_EQUAL_INSTANCES(wi_description(runtimetest), WI_STR("value=42"), "");
WI_TEST_ASSERT_EQUALS(wi_hash(runtimetest), 42U, "");
wi_release(runtimetest);
}
void wi_test_runtime_pool(void) {
wi_pool_t *pool, *pool2;
_wi_runtimetest_t *runtimetest, *runtimetest2;
_wi_runtimetest_deallocs = 0;
pool = wi_pool_init(wi_pool_alloc());
runtimetest = wi_retain(wi_autorelease(_wi_runtimetest_init_with_value(_wi_runtimetest_alloc(), 42)));
wi_release(pool);
WI_TEST_ASSERT_EQUALS(wi_retain_count(runtimetest), 1U, "");
wi_release(runtimetest);
pool = wi_pool_init(wi_pool_alloc());
runtimetest = wi_retain(wi_autorelease(_wi_runtimetest_init_with_value(_wi_runtimetest_alloc(), 42)));
wi_pool_drain(pool);
WI_TEST_ASSERT_EQUALS(wi_retain_count(runtimetest), 1U, "");
wi_release(pool);
wi_release(runtimetest);
pool = wi_pool_init(wi_pool_alloc());
runtimetest = wi_retain(wi_autorelease(_wi_runtimetest_init_with_value(_wi_runtimetest_alloc(), 42)));
pool2 = wi_pool_init(wi_pool_alloc());
runtimetest2 = wi_retain(wi_autorelease(_wi_runtimetest_init_with_value(_wi_runtimetest_alloc(), 42)));
wi_release(pool2);
WI_TEST_ASSERT_EQUALS(wi_retain_count(runtimetest2), 1U, "");
wi_release(pool);
WI_TEST_ASSERT_EQUALS(wi_retain_count(runtimetest), 1U, "");
wi_release(runtimetest);
wi_release(runtimetest2);
}
void wi_test_runtime_retain(void) {
_wi_runtimetest_t *runtimetest, *runtimetest2;
_wi_runtimetest_deallocs = 0;
runtimetest = _wi_runtimetest_init_with_value(_wi_runtimetest_alloc(), 42);
WI_TEST_ASSERT_EQUALS(wi_retain_count(runtimetest), 1U, "");
runtimetest2 = wi_retain(runtimetest);
WI_TEST_ASSERT_EQUALS(wi_retain_count(runtimetest), 2U, "");
WI_TEST_ASSERT_EQUALS(runtimetest, runtimetest2, "");
wi_release(runtimetest);
WI_TEST_ASSERT_EQUALS(wi_retain_count(runtimetest), 1U, "");
wi_release(runtimetest);
WI_TEST_ASSERT_EQUALS(_wi_runtimetest_deallocs, 1U, "");
}
syntax highlighted by Code2HTML, v. 0.9.1