SCP: Add support for library unit test routines
This commit is contained in:
parent
8ac1845b30
commit
0daa80e03d
10 changed files with 149 additions and 106 deletions
124
scp.c
124
scp.c
|
@ -14430,101 +14430,10 @@ return cptr;
|
|||
}
|
||||
|
||||
/*
|
||||
Compiled in unit tests for the various device oriented library
|
||||
modules: sim_card, sim_disk, sim_tape, sim_ether, sim_tmxr, etc.
|
||||
* Compiled in unit tests for the various device oriented library
|
||||
* modules: sim_card, sim_disk, sim_tape, sim_ether, sim_tmxr, etc.
|
||||
*/
|
||||
|
||||
static t_stat create_card_file (const char *filename, int cards)
|
||||
{
|
||||
FILE *f;
|
||||
int i;
|
||||
|
||||
f = fopen (filename, "w");
|
||||
if (f == NULL)
|
||||
return SCPE_OPENERR;
|
||||
for (i=0; i<cards; i++)
|
||||
fprintf (f, "%05d ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\n", i);
|
||||
fclose (f);
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
#define TST(_stat) do { if (SCPE_OK != (stat = (_stat))) {sim_printf ("Error: %d - '%s' processing: " #_stat "\n", stat, sim_error_text(stat)); goto done; }} while (0)
|
||||
|
||||
static t_stat test_card (DEVICE *dptr)
|
||||
{
|
||||
t_stat stat = SCPE_OK;
|
||||
#if defined(USE_SIM_CARD) && defined(SIM_CARD_API)
|
||||
char cmd[CBUFSIZE];
|
||||
char saved_filename[4*CBUFSIZE];
|
||||
uint16 card_image[80];
|
||||
|
||||
if ((dptr->units->flags & UNIT_RO) == 0) /* Punch device? */
|
||||
return SCPE_OK;
|
||||
|
||||
sim_printf ("Testing %s device sim_card APIs\n", dptr->name);
|
||||
|
||||
(void)remove("file1.deck");
|
||||
(void)remove("file2.deck");
|
||||
(void)remove("file3.deck");
|
||||
(void)remove("file4.deck");
|
||||
|
||||
TST(create_card_file ("File10.deck", 10));
|
||||
TST(create_card_file ("File20.deck", 20));
|
||||
TST(create_card_file ("File30.deck", 30));
|
||||
TST(create_card_file ("File40.deck", 40));
|
||||
|
||||
sprintf (cmd, "%s File10.deck", dptr->name);
|
||||
TST(attach_cmd (0, cmd));
|
||||
sprintf (cmd, "%s File20.deck", dptr->name);
|
||||
TST(attach_cmd (0, cmd));
|
||||
sprintf (cmd, "%s -S File30.deck", dptr->name);
|
||||
TST(attach_cmd (0, cmd));
|
||||
sprintf (cmd, "%s -S -E File40.deck", dptr->name);
|
||||
TST(attach_cmd (0, cmd));
|
||||
sprintf (saved_filename, "%s %s", dptr->name, dptr->units->filename);
|
||||
show_cmd (0, dptr->name);
|
||||
sim_printf ("Input Hopper Count: %d\n", sim_card_input_hopper_count(dptr->units));
|
||||
sim_printf ("Output Hopper Count: %d\n", sim_card_output_hopper_count(dptr->units));
|
||||
while (!sim_card_eof (dptr->units))
|
||||
TST(sim_read_card (dptr->units, card_image));
|
||||
sim_printf ("Input Hopper Count: %d\n", sim_card_input_hopper_count(dptr->units));
|
||||
sim_printf ("Output Hopper Count: %d\n", sim_card_output_hopper_count(dptr->units));
|
||||
sim_printf ("Detaching %s\n", dptr->name);
|
||||
TST(detach_cmd (0, dptr->name));
|
||||
show_cmd (0, dptr->name);
|
||||
sim_printf ("Input Hopper Count: %d\n", sim_card_input_hopper_count(dptr->units));
|
||||
sim_printf ("Output Hopper Count: %d\n", sim_card_output_hopper_count(dptr->units));
|
||||
sim_printf ("Attaching Saved Filenames: %s\n", saved_filename + strlen(dptr->name));
|
||||
TST(attach_cmd (0, saved_filename));
|
||||
show_cmd (0, dptr->name);
|
||||
sim_printf ("Input Hopper Count: %d\n", sim_card_input_hopper_count(dptr->units));
|
||||
sim_printf ("Output Hopper Count: %d\n", sim_card_output_hopper_count(dptr->units));
|
||||
TST(detach_cmd (0, dptr->name));
|
||||
done:
|
||||
(void)remove ("file10.deck");
|
||||
(void)remove ("file20.deck");
|
||||
(void)remove ("file30.deck");
|
||||
(void)remove ("file40.deck");
|
||||
#endif /* defined(USE_SIM_CARD) && defined(SIM_CARD_API) */
|
||||
return stat;
|
||||
}
|
||||
|
||||
static t_stat test_tape (DEVICE *dptr)
|
||||
{
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
static t_stat test_disk (DEVICE *dptr)
|
||||
{
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
static t_stat test_ether (DEVICE *dptr)
|
||||
{
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
|
||||
static t_stat sim_library_unit_tests (void)
|
||||
{
|
||||
int i;
|
||||
|
@ -14532,17 +14441,24 @@ DEVICE *dptr;
|
|||
t_stat stat = SCPE_OK;
|
||||
|
||||
for (i = 0; (dptr = sim_devices[i]) != NULL; i++) {
|
||||
if (DEV_TYPE(dptr) == DEV_CARD)
|
||||
stat = test_card (dptr);
|
||||
else
|
||||
if (DEV_TYPE(dptr) == DEV_TAPE)
|
||||
stat = test_tape (dptr);
|
||||
else
|
||||
if (DEV_TYPE(dptr) == DEV_DISK)
|
||||
stat = test_disk (dptr);
|
||||
else
|
||||
if (DEV_TYPE(dptr) == DEV_ETHER)
|
||||
stat = test_ether (dptr);
|
||||
switch (DEV_TYPE(dptr)) {
|
||||
#if defined(USE_SIM_CARD)
|
||||
case DEV_CARD:
|
||||
stat = sim_card_test (dptr);
|
||||
break;
|
||||
#endif
|
||||
case DEV_DISK:
|
||||
stat = sim_disk_test (dptr);
|
||||
break;
|
||||
case DEV_ETHER:
|
||||
stat = sim_ether_test (dptr);
|
||||
break;
|
||||
case DEV_TAPE:
|
||||
stat = sim_tape_test (dptr);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return stat;
|
||||
}
|
||||
|
|
22
scp.h
22
scp.h
|
@ -412,6 +412,28 @@ extern t_bool (*sim_vm_fprint_stopped) (FILE *st, t_stat reason);
|
|||
extern t_value (*sim_vm_pc_value) (void);
|
||||
extern t_bool (*sim_vm_is_subroutine_call) (t_addr **ret_addrs);
|
||||
|
||||
/* Core SCP libraries can potentially have unit test routines.
|
||||
These defines help implement consistent unit test functionality */
|
||||
|
||||
#define SIM_TEST_INIT \
|
||||
int test_stat; \
|
||||
const char *sim_test; \
|
||||
jmp_buf sim_test_env; \
|
||||
if ((test_stat = setjmp (sim_test_env))) { \
|
||||
sim_printf ("Error: %d - '%s' processing: %s\n", \
|
||||
test_stat, sim_error_text(test_stat), \
|
||||
sim_test); \
|
||||
return test_stat; \
|
||||
}
|
||||
#define SIM_TEST(_stat) \
|
||||
do { \
|
||||
if (SCPE_OK != (test_stat = (_stat))) { \
|
||||
sim_test = #_stat; \
|
||||
longjmp (sim_test_env, test_stat); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
82
sim_card.c
82
sim_card.c
|
@ -1380,11 +1380,91 @@ t_stat sim_card_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, cons
|
|||
return SCPE_OK;
|
||||
}
|
||||
|
||||
#else
|
||||
static t_stat create_card_file (const char *filename, int cards)
|
||||
{
|
||||
FILE *f;
|
||||
int i;
|
||||
|
||||
f = fopen (filename, "w");
|
||||
if (f == NULL)
|
||||
return SCPE_OPENERR;
|
||||
for (i=0; i<cards; i++)
|
||||
fprintf (f, "%05d ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\n", i);
|
||||
fclose (f);
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
#include <setjmp.h>
|
||||
|
||||
t_stat sim_card_test (DEVICE *dptr)
|
||||
{
|
||||
t_stat stat = SCPE_OK;
|
||||
#if defined(USE_SIM_CARD) && defined(SIM_CARD_API)
|
||||
char cmd[CBUFSIZE];
|
||||
char saved_filename[4*CBUFSIZE];
|
||||
uint16 card_image[80];
|
||||
SIM_TEST_INIT;
|
||||
|
||||
if ((dptr->units->flags & UNIT_RO) == 0) /* Punch device? */
|
||||
return SCPE_OK;
|
||||
|
||||
sim_printf ("Testing %s device sim_card APIs\n", dptr->name);
|
||||
|
||||
(void)remove("file1.deck");
|
||||
(void)remove("file2.deck");
|
||||
(void)remove("file3.deck");
|
||||
(void)remove("file4.deck");
|
||||
|
||||
SIM_TEST(create_card_file ("File10.deck", 10));
|
||||
SIM_TEST(create_card_file ("File20.deck", 20));
|
||||
SIM_TEST(create_card_file ("File30.deck", 30));
|
||||
SIM_TEST(create_card_file ("File40.deck", 40));
|
||||
|
||||
sprintf (cmd, "%s File10.deck", dptr->name);
|
||||
SIM_TEST(attach_cmd (0, cmd));
|
||||
sprintf (cmd, "%s File20.deck", dptr->name);
|
||||
SIM_TEST(attach_cmd (0, cmd));
|
||||
sprintf (cmd, "%s -S File30.deck", dptr->name);
|
||||
SIM_TEST(attach_cmd (0, cmd));
|
||||
sprintf (cmd, "%s -S -E File40.deck", dptr->name);
|
||||
SIM_TEST(attach_cmd (0, cmd));
|
||||
sprintf (saved_filename, "%s %s", dptr->name, dptr->units->filename);
|
||||
show_cmd (0, dptr->name);
|
||||
sim_printf ("Input Hopper Count: %d\n", sim_card_input_hopper_count(dptr->units));
|
||||
sim_printf ("Output Hopper Count: %d\n", sim_card_output_hopper_count(dptr->units));
|
||||
while (!sim_card_eof (dptr->units))
|
||||
SIM_TEST(sim_read_card (dptr->units, card_image));
|
||||
sim_printf ("Input Hopper Count: %d\n", sim_card_input_hopper_count(dptr->units));
|
||||
sim_printf ("Output Hopper Count: %d\n", sim_card_output_hopper_count(dptr->units));
|
||||
sim_printf ("Detaching %s\n", dptr->name);
|
||||
SIM_TEST(detach_cmd (0, dptr->name));
|
||||
show_cmd (0, dptr->name);
|
||||
sim_printf ("Input Hopper Count: %d\n", sim_card_input_hopper_count(dptr->units));
|
||||
sim_printf ("Output Hopper Count: %d\n", sim_card_output_hopper_count(dptr->units));
|
||||
sim_printf ("Attaching Saved Filenames: %s\n", saved_filename + strlen(dptr->name));
|
||||
SIM_TEST(attach_cmd (0, saved_filename));
|
||||
show_cmd (0, dptr->name);
|
||||
sim_printf ("Input Hopper Count: %d\n", sim_card_input_hopper_count(dptr->units));
|
||||
sim_printf ("Output Hopper Count: %d\n", sim_card_output_hopper_count(dptr->units));
|
||||
SIM_TEST(detach_cmd (0, dptr->name));
|
||||
(void)remove ("file10.deck");
|
||||
(void)remove ("file20.deck");
|
||||
(void)remove ("file30.deck");
|
||||
(void)remove ("file40.deck");
|
||||
#endif /* defined(USE_SIM_CARD) && defined(SIM_CARD_API) */
|
||||
return stat;
|
||||
}
|
||||
|
||||
#else /* !defined(USE_SIM_CARD) */
|
||||
|
||||
t_stat sim_card_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr)
|
||||
{
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
t_stat sim_card_test (DEVICE *dptr)
|
||||
{
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
#endif /* USE_SIM_CARD */
|
||||
|
|
|
@ -130,6 +130,9 @@ extern CONST char sim_six_to_ascii[64]; /* Map BCD to ASCII */
|
|||
extern CONST char sim_ascii_to_six[128]; /* Map 7 bit ASCII to BCD */
|
||||
extern CONST uint8 sim_parity_table[64]; /* 64 entry odd parity table */
|
||||
|
||||
/* Unit test routine */
|
||||
extern sim_card_test (DEVICE *dptr);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -51,6 +51,7 @@ Public routines:
|
|||
sim_disk_set_async enable asynchronous operation
|
||||
sim_disk_clr_async disable asynchronous operation
|
||||
sim_disk_data_trace debug support
|
||||
sim_disk_test unit test routine
|
||||
|
||||
Internal routines:
|
||||
|
||||
|
@ -4663,3 +4664,8 @@ struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx;
|
|||
return WriteVirtualDiskSectors(hVHD, buf, sects, sectswritten, ctx->sector_size, lba);
|
||||
}
|
||||
#endif
|
||||
|
||||
t_stat sim_disk_test (DEVICE *dptr)
|
||||
{
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
|
|
@ -94,6 +94,7 @@ t_offset sim_disk_size (UNIT *uptr);
|
|||
t_bool sim_disk_vhd_support (void);
|
||||
t_bool sim_disk_raw_support (void);
|
||||
void sim_disk_data_trace (UNIT *uptr, const uint8 *data, size_t lba, size_t len, const char* txt, int detail, uint32 reason);
|
||||
t_stat sim_disk_test (DEVICE *dptr);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -968,6 +968,8 @@ void eth_show_dev (FILE* st, ETH_DEV* dev)
|
|||
{}
|
||||
static int _eth_get_system_id (char *buf, size_t buf_size)
|
||||
{memset (buf, 0, buf_size); return 0;}
|
||||
t_stat sim_ether_test (DEVICE *dptr)
|
||||
{return SCPE_OK;}
|
||||
#else /* endif unimplemented */
|
||||
|
||||
const char *eth_capabilities(void)
|
||||
|
@ -4018,4 +4020,9 @@ if (dev->eth_api == ETH_API_NAT)
|
|||
sim_slirp_show ((SLIRP *)dev->handle, st);
|
||||
#endif
|
||||
}
|
||||
|
||||
t_stat sim_ether_test (DEVICE *dptr)
|
||||
{
|
||||
return SCPE_OK;
|
||||
}
|
||||
#endif /* USE_NETWORK */
|
||||
|
|
|
@ -378,8 +378,8 @@ void ethq_insert_data(ETH_QUE* que, int32 type, /* insert item into FIFO
|
|||
const uint8 *data, int used, size_t len,
|
||||
size_t crc_len, const uint8 *crc_data, int32 status);
|
||||
t_stat ethq_destroy(ETH_QUE* que); /* release FIFO queue */
|
||||
|
||||
const char *eth_capabilities(void);
|
||||
t_stat sim_ether_test (DEVICE *dptr); /* unit test routine */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -88,6 +88,8 @@
|
|||
sim_tape_show_dens show tape density
|
||||
sim_tape_set_async enable asynchronous operation
|
||||
sim_tape_clr_async disable asynchronous operation
|
||||
aim_tape_test unit test routine
|
||||
|
||||
*/
|
||||
|
||||
#include "sim_defs.h"
|
||||
|
@ -2747,3 +2749,8 @@ else { /* otherwise get the den
|
|||
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
t_stat sim_tape_test (DEVICE *dptr)
|
||||
{
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
|
|
@ -209,6 +209,7 @@ t_stat sim_tape_set_dens (UNIT *uptr, int32 val, CONST char *cptr, void *desc);
|
|||
t_stat sim_tape_show_dens (FILE *st, UNIT *uptr, int32 val, CONST void *desc);
|
||||
t_stat sim_tape_set_asynch (UNIT *uptr, int latency);
|
||||
t_stat sim_tape_clr_asynch (UNIT *uptr);
|
||||
t_stat sim_tape_test (DEVICE *dptr);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue