mirror of
https://github.com/tbamud/tbamud.git
synced 2025-09-22 05:50:48 +02:00
Add munit for unit testing.
Main method extracted to separate file to make it easier to test the _rest_ of the code. munit is added as a submodule by running `cd src; git submodule add https://github.com/nemequ/munit.git` . Unit testing has so far only been tested on ubuntu.
This commit is contained in:
parent
455e3a06ea
commit
eb8e200a31
11 changed files with 280 additions and 1 deletions
9
.gitignore
vendored
9
.gitignore
vendored
|
@ -71,3 +71,12 @@ lib/plrobjs/index
|
||||||
/lib/etc/last
|
/lib/etc/last
|
||||||
# or mail
|
# or mail
|
||||||
lib/etc/plrmail
|
lib/etc/plrmail
|
||||||
|
|
||||||
|
# test object files, etc
|
||||||
|
src/test/depend
|
||||||
|
src/test/*.o
|
||||||
|
src/test/testfile
|
||||||
|
|
||||||
|
|
||||||
|
# ide etc.
|
||||||
|
.vscode
|
||||||
|
|
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "src/munit"]
|
||||||
|
path = src/munit
|
||||||
|
url = https://github.com/nemequ/munit.git
|
|
@ -198,7 +198,7 @@ void gettimeofday(struct timeval *t, struct timezone *dummy)
|
||||||
|
|
||||||
#endif /* CIRCLE_WINDOWS || CIRCLE_MACINTOSH */
|
#endif /* CIRCLE_WINDOWS || CIRCLE_MACINTOSH */
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int _main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int pos = 1;
|
int pos = 1;
|
||||||
const char *dir;
|
const char *dir;
|
||||||
|
@ -390,6 +390,7 @@ int main(int argc, char **argv)
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Reload players after a copyover */
|
/* Reload players after a copyover */
|
||||||
void copyover_recover()
|
void copyover_recover()
|
||||||
{
|
{
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#define COPYOVER_FILE "copyover.dat"
|
#define COPYOVER_FILE "copyover.dat"
|
||||||
|
|
||||||
/* comm.c */
|
/* comm.c */
|
||||||
|
int _main(int argc, char **argv);
|
||||||
void close_socket(struct descriptor_data *d);
|
void close_socket(struct descriptor_data *d);
|
||||||
void game_info(const char *messg, ...) __attribute__ ((format (printf, 1, 2)));
|
void game_info(const char *messg, ...) __attribute__ ((format (printf, 1, 2)));
|
||||||
size_t send_to_char(struct char_data *ch, const char *messg, ...) __attribute__
|
size_t send_to_char(struct char_data *ch, const char *messg, ...) __attribute__
|
||||||
|
|
90
src/main.c
Normal file
90
src/main.c
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
/**************************************************************************
|
||||||
|
* File: comm.c Part of tbaMUD *
|
||||||
|
* Usage: Communication, socket handling, main(), central game loop. *
|
||||||
|
* *
|
||||||
|
* All rights reserved. See license for complete information. *
|
||||||
|
* *
|
||||||
|
* Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University *
|
||||||
|
* CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. *
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include "conf.h"
|
||||||
|
#include "sysdep.h"
|
||||||
|
|
||||||
|
/* Begin conf.h dependent includes */
|
||||||
|
|
||||||
|
#if CIRCLE_GNU_LIBC_MEMORY_TRACK
|
||||||
|
# include <mcheck.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CIRCLE_MACINTOSH /* Includes for the Macintosh */
|
||||||
|
# define SIGPIPE 13
|
||||||
|
# define SIGALRM 14
|
||||||
|
/* GUSI headers */
|
||||||
|
# include <sys/ioctl.h>
|
||||||
|
/* Codewarrior dependant */
|
||||||
|
# include <SIOUX.h>
|
||||||
|
# include <console.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CIRCLE_WINDOWS /* Includes for Win32 */
|
||||||
|
# ifdef __BORLANDC__
|
||||||
|
# include <dir.h>
|
||||||
|
# else /* MSVC */
|
||||||
|
# include <direct.h>
|
||||||
|
# include <winsock.h>
|
||||||
|
# endif
|
||||||
|
# include <mmsystem.h>
|
||||||
|
#endif /* CIRCLE_WINDOWS */
|
||||||
|
|
||||||
|
#ifdef CIRCLE_AMIGA /* Includes for the Amiga */
|
||||||
|
# include <sys/ioctl.h>
|
||||||
|
# include <clib/socket_protos.h>
|
||||||
|
#endif /* CIRCLE_AMIGA */
|
||||||
|
|
||||||
|
#ifdef CIRCLE_ACORN /* Includes for the Acorn (RiscOS) */
|
||||||
|
# include <socklib.h>
|
||||||
|
# include <inetlib.h>
|
||||||
|
# include <sys/ioctl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_ARPA_TELNET_H
|
||||||
|
#include <arpa/telnet.h>
|
||||||
|
#else
|
||||||
|
#include "telnet.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* end conf.h dependent includes */
|
||||||
|
|
||||||
|
/* Note, most includes for all platforms are in sysdep.h. The list of
|
||||||
|
* files that is included is controlled by conf.h for that platform. */
|
||||||
|
|
||||||
|
#include "structs.h"
|
||||||
|
#include "utils.h"
|
||||||
|
#include "comm.h"
|
||||||
|
#include "interpreter.h"
|
||||||
|
#include "handler.h"
|
||||||
|
#include "db.h"
|
||||||
|
#include "house.h"
|
||||||
|
#include "oasis.h"
|
||||||
|
#include "genolc.h"
|
||||||
|
#include "dg_scripts.h"
|
||||||
|
#include "dg_event.h"
|
||||||
|
#include "screen.h" /* to support the gemote act type command */
|
||||||
|
#include "constants.h" /* For mud versions */
|
||||||
|
#include "boards.h"
|
||||||
|
#include "act.h"
|
||||||
|
#include "ban.h"
|
||||||
|
#include "msgedit.h"
|
||||||
|
#include "fight.h"
|
||||||
|
#include "spells.h" /* for affect_update */
|
||||||
|
#include "modify.h"
|
||||||
|
#include "quest.h"
|
||||||
|
#include "ibt.h" /* for free_ibt_lists */
|
||||||
|
#include "mud_event.h"
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
return _main(argc, argv);
|
||||||
|
}
|
1
src/munit
Submodule
1
src/munit
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit fbbdf1467eb0d04a6ee465def2e529e4c87f2118
|
75
src/test/Makefile
Normal file
75
src/test/Makefile
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
# Using µnit is very simple; just include the header and add the C
|
||||||
|
# file to your sources. That said, here is a simple Makefile to build
|
||||||
|
# the example.
|
||||||
|
|
||||||
|
CSTD:=99
|
||||||
|
OPENMP:=n
|
||||||
|
ASAN:=n
|
||||||
|
UBSAN:=n
|
||||||
|
EXTENSION:=
|
||||||
|
TEST_ENV:=
|
||||||
|
CFLAGS:=-Wall -Wno-char-subscripts -Wno-unused-but-set-variable
|
||||||
|
AGGRESSIVE_WARNINGS=n
|
||||||
|
LIBS:=-lcrypt
|
||||||
|
|
||||||
|
#ifeq ($(CC),pgcc)
|
||||||
|
# CFLAGS+=-c$(CSTD)
|
||||||
|
#else
|
||||||
|
# CFLAGS+=-std=c$(CSTD)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ifeq ($(OPENMP),y)
|
||||||
|
ifeq ($(CC),pgcc)
|
||||||
|
CFLAGS+=-mp
|
||||||
|
else
|
||||||
|
CFLAGS+=-fopenmp
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(SANITIZER),)
|
||||||
|
CFLAGS+=-fsanitize=$(SANITIZER)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(CC),pgcc)
|
||||||
|
ifeq ($(EXTRA_WARNINGS),y)
|
||||||
|
CFLAGS+=-Wall -Wextra -Werror
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(ASAN),y)
|
||||||
|
CFLAGS+=-fsanitize=address
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(UBSAN),y)
|
||||||
|
CFLAGS+=-fsanitize=undefined
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
MUNIT_FILES := ../munit/munit.h ../munit/munit.c
|
||||||
|
TEST_FILES := $(ls *.c)
|
||||||
|
|
||||||
|
# exclude main.c to avoid having multiple entrypoints.
|
||||||
|
OBJ_FILES_FROM_MUD_CODE != ls ../*.c | grep -v main.c | sed 's/\.c$$/.o/g' | xargs
|
||||||
|
OBJ_FILES_FORM_MUNIT:= ../munit/munit.o
|
||||||
|
OBJ_FILES_FROM_TESTS!= ls *.c | sed 's/\$$.c/.o/g' | xargs
|
||||||
|
|
||||||
|
OBJ_FILES := $(OBJ_FILES_FROM_MUD_CODE) $(OBJ_FILES_FORM_MUNIT) $(OBJ_FILES_FROM_TESTS) $(LIBS)
|
||||||
|
|
||||||
|
testfile: $(OBJ_FILES)
|
||||||
|
$(CC) $(CFLAGS) -o testfile $(OBJ_FILES)
|
||||||
|
|
||||||
|
test: testfile
|
||||||
|
$(TEST_ENV) ./testfile
|
||||||
|
|
||||||
|
$%.o: %.c
|
||||||
|
$(CC) $< $(CFLAGS) -c -o $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o testfile depend
|
||||||
|
all: test
|
||||||
|
|
||||||
|
default: all
|
||||||
|
|
||||||
|
depend:
|
||||||
|
$(CC) -MM *.c > depend
|
||||||
|
|
||||||
|
-include depend
|
40
src/test/test_handler.c
Normal file
40
src/test/test_handler.c
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
#include "test_handler.h"
|
||||||
|
|
||||||
|
static void run_single_get_number_test(const char* input_param, const char *name_result, int number_result);
|
||||||
|
|
||||||
|
UNIT_TEST(test_get_number)
|
||||||
|
{
|
||||||
|
run_single_get_number_test("1.feather", "feather", 1);
|
||||||
|
run_single_get_number_test("2.feather", "feather", 2);
|
||||||
|
run_single_get_number_test("1.feat", "feat", 1);
|
||||||
|
run_single_get_number_test("feather", "feather", 1);
|
||||||
|
run_single_get_number_test("10.feather", "feather", 10);
|
||||||
|
|
||||||
|
return MUNIT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void run_single_get_number_test(const char* input_param, const char *name_result, int number_result)
|
||||||
|
{
|
||||||
|
char *to_free;
|
||||||
|
char *input = to_free = strdup(input_param);
|
||||||
|
|
||||||
|
int number = get_number(&input);
|
||||||
|
munit_assert_int32(number, ==, number_result);
|
||||||
|
munit_assert_string_equal(input, name_result);
|
||||||
|
|
||||||
|
free(to_free);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Creating a test suite is pretty simple. First, you'll need an
|
||||||
|
* array of tests: */
|
||||||
|
MunitTest handler_c_tests[] = {
|
||||||
|
{
|
||||||
|
(char*) "/get_number",
|
||||||
|
test_get_number,
|
||||||
|
NULL, // setup callback
|
||||||
|
NULL, // cleanup callback
|
||||||
|
MUNIT_TEST_OPTION_NONE,
|
||||||
|
NULL
|
||||||
|
},
|
||||||
|
{ NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }
|
||||||
|
};
|
10
src/test/test_handler.h
Normal file
10
src/test/test_handler.h
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#include "testrunner.h"
|
||||||
|
|
||||||
|
#ifndef TEST_HANDLER_H
|
||||||
|
#define TEST_HANDLER_H
|
||||||
|
|
||||||
|
extern MunitTest handler_c_tests[];
|
||||||
|
|
||||||
|
UNIT_TEST(test_get_number);
|
||||||
|
|
||||||
|
#endif
|
23
src/test/testrunner.c
Normal file
23
src/test/testrunner.c
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
#include "testrunner.h"
|
||||||
|
#include "test_handler.h"
|
||||||
|
|
||||||
|
static MunitSuite suites[] = {
|
||||||
|
{ "/handler.c", handler_c_tests, NULL, 1, MUNIT_SUITE_OPTION_NONE },
|
||||||
|
{ NULL, NULL, NULL, 0, MUNIT_SUITE_OPTION_NONE }
|
||||||
|
};
|
||||||
|
|
||||||
|
static const MunitSuite test_suite = {
|
||||||
|
(char*) "",
|
||||||
|
/* The first parameter is the array of test suites. */
|
||||||
|
NULL,
|
||||||
|
/* The second an array of suites to trigger from this one */
|
||||||
|
suites,
|
||||||
|
MUNIT_SUITE_OPTION_NONE
|
||||||
|
};
|
||||||
|
|
||||||
|
int main(int argc, char* argv[MUNIT_ARRAY_PARAM(argc + 1)]) {
|
||||||
|
/* Finally, we'll actually run our test suite! That second argument
|
||||||
|
* is the user_data parameter which will be passed either to the
|
||||||
|
* test or (if provided) the fixture setup function. */
|
||||||
|
return munit_suite_main(&test_suite, (void*) "µnit", argc, argv);
|
||||||
|
}
|
26
src/test/testrunner.h
Normal file
26
src/test/testrunner.h
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#ifndef TESTRUNNER_H
|
||||||
|
#define TESTRUNNER_H
|
||||||
|
|
||||||
|
#include "../conf.h"
|
||||||
|
#include "../sysdep.h"
|
||||||
|
#include "../structs.h"
|
||||||
|
#include "../utils.h"
|
||||||
|
#include "../comm.h"
|
||||||
|
#include "../db.h"
|
||||||
|
#include "../handler.h"
|
||||||
|
#include "../screen.h"
|
||||||
|
#include "../interpreter.h"
|
||||||
|
#include "../spells.h"
|
||||||
|
#include "../dg_scripts.h"
|
||||||
|
#include "../act.h"
|
||||||
|
#include "../class.h"
|
||||||
|
#include "../fight.h"
|
||||||
|
#include "../quest.h"
|
||||||
|
#include "../mud_event.h"
|
||||||
|
#include "../munit/munit.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define UNIT_TEST(test_name) MunitResult (test_name)(const MunitParameter params[], void* data)
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
Loading…
Add table
Add a link
Reference in a new issue