| #include <pocketsphinx.h> |
| #include "pocketsphinx_internal.h" |
| #include "test_macros.h" |
|
|
| #define LEN(array) (sizeof(array) / sizeof(array[0])) |
| static char *good_argv[] = { |
| "pocketsphinx", |
| "-hmm", |
| "en-us", |
| "-samprate", |
| "16000", |
| "-beam", |
| "0.005", |
| "-backtrace", |
| "yes" |
| }; |
| static int good_argc = LEN(good_argv); |
| static char *good_json = \ |
| "{ \"hmm\": \"en-us\",\n" |
| " \"samprate\": 16000,\n" |
| " \"beam\": 5e-3,\n" |
| " \"backtrace\": true\n" |
| "}"; |
| static char *cmd_argv[] = { |
| "pocketsphinx", |
| "-hmm", |
| "en-us", |
| "-samprate", |
| "16000", |
| "-beam", |
| "0.005", |
| "-backtrace", |
| "yes" |
| }; |
| static int cmd_argc = LEN(cmd_argv); |
| static char *bad_argv[] = { |
| "pocketsphinx", |
| "-hmm", |
| "en-us", |
| "-samprate", |
| "forty-two", |
| "beam", |
| "1e-80", |
| "-backtrace", |
| "WTF" |
| }; |
| static int bad_argc = LEN(bad_argv); |
| static char *bad_json = \ |
| "{ \"hmm\": en us,\n" |
| " \"samprate\": 16000,\n" |
| " \"beam\": 5e-3,\n" |
| " \"backtrace\": true\n" |
| "}"; |
| static char *ugly_json = \ |
| "hmm: en-us samprate: 16000 beam: 0.005 backtrace: true"; |
| static char *hard_json = \ |
| "{ \"hmm\": \"\\\\model\\\\en-us\",\n" |
| " \"keyphrase\": \"spam\tspam \\\"spam\\\" eggs\\nand spam\"\n" |
| "}"; |
| |
| static char *bad_hard_json = \ |
| "{ \"hmm\": \"\\\\model\\\\en-us\",\n" |
| " \"keyphrase\": \"spam\tspam \\\"spam\\\"\\u0020eggs\\nand spam\"\n" |
| "}"; |
|
|
| static void |
| check_live_args(ps_config_t *config) |
| { |
| |
| TEST_EQUAL(0, strcmp("en-us", ps_config_str(config, "hmm"))); |
| TEST_EQUAL(16000, ps_config_int(config, "samprate")); |
| TEST_EQUAL_FLOAT(5e-3, ps_config_float(config, "beam")); |
| |
| |
| TEST_ASSERT(ps_config_set_str(config, "hmm", "fr-fr")); |
| TEST_EQUAL(0, strcmp("fr-fr", ps_config_str(config, "hmm"))); |
| TEST_ASSERT(ps_config_set_int(config, "samprate", 8000)); |
| TEST_EQUAL(8000, ps_config_int(config, "samprate")); |
| TEST_ASSERT(ps_config_set_float(config, "beam", 1e-40)); |
| TEST_EQUAL_FLOAT(1e-40, ps_config_float(config, "beam")); |
| } |
|
|
| static void |
| test_config_init(void) |
| { |
| ps_config_t *config; |
|
|
| TEST_ASSERT(config = ps_config_init(NULL)); |
| ps_config_retain(config); |
| TEST_EQUAL(1, ps_config_free(config)); |
| TEST_EQUAL(0, ps_config_free(config)); |
|
|
| TEST_ASSERT(config = ps_config_init(NULL)); |
| TEST_ASSERT(ps_config_set_str(config, "hmm", "en-us")); |
| TEST_ASSERT(ps_config_set_int(config, "samprate", 16000)); |
| TEST_ASSERT(ps_config_set_float(config, "beam", 0.005)); |
| check_live_args(config); |
| TEST_EQUAL(0, ps_config_free(config)); |
| } |
|
|
| static void |
| test_config_args(void) |
| { |
| ps_config_t *config; |
| TEST_ASSERT(config = ps_config_parse_args(NULL, good_argc, good_argv)); |
| TEST_EQUAL(0, ps_config_free(config)); |
| TEST_EQUAL(NULL, ps_config_parse_args(NULL, bad_argc, bad_argv)); |
|
|
| TEST_ASSERT(config = ps_config_parse_args(NULL, cmd_argc, cmd_argv)); |
| check_live_args(config); |
| TEST_EQUAL(0, ps_config_free(config)); |
| } |
|
|
| static void |
| test_config_json(void) |
| { |
| ps_config_t *config; |
| char *json; |
| |
| TEST_ASSERT(config = ps_config_parse_json(NULL, good_json)); |
| TEST_EQUAL(0, ps_config_free(config)); |
| TEST_EQUAL(NULL, ps_config_parse_json(NULL, bad_json)); |
|
|
| TEST_ASSERT(config = ps_config_parse_json(NULL, good_json)); |
| check_live_args(config); |
| TEST_EQUAL(0, ps_config_free(config)); |
|
|
| TEST_ASSERT(config = ps_config_parse_json(NULL, ugly_json)); |
| |
| json = ckd_salloc(ps_config_serialize_json(config)); |
| check_live_args(config); |
| TEST_EQUAL(0, ps_config_free(config)); |
|
|
| |
| TEST_ASSERT(config = ps_config_parse_json(NULL, json)); |
| check_live_args(config); |
| TEST_EQUAL(0, ps_config_free(config)); |
| ckd_free(json); |
|
|
| TEST_ASSERT(config = ps_config_parse_json(NULL, hard_json)); |
| printf("%s\n", ps_config_str(config, "hmm")); |
| printf("%s\n", ps_config_str(config, "keyphrase")); |
| TEST_EQUAL(0, strcmp(ps_config_str(config, "hmm"), |
| "\\model\\en-us")); |
| TEST_EQUAL(0, strcmp(ps_config_str(config, "keyphrase"), |
| "spam\tspam \"spam\" eggs\nand spam")); |
| json = ckd_salloc(ps_config_serialize_json(config)); |
| ps_config_free(config); |
|
|
| TEST_ASSERT(config = ps_config_parse_json(NULL, json)); |
| printf("%s\n", ps_config_str(config, "hmm")); |
| printf("%s\n", ps_config_str(config, "keyphrase")); |
| TEST_EQUAL(0, strcmp(ps_config_str(config, "hmm"), |
| "\\model\\en-us")); |
| TEST_EQUAL(0, strcmp(ps_config_str(config, "keyphrase"), |
| "spam\tspam \"spam\" eggs\nand spam")); |
| ps_config_free(config); |
| ckd_free(json); |
| TEST_EQUAL(NULL, ps_config_parse_json(NULL, bad_hard_json)); |
| } |
|
|
| static void |
| test_validate_config(void) |
| { |
| ps_config_t *config; |
| TEST_ASSERT(config = |
| ps_config_parse_json( |
| NULL, |
| "hmm: \"" MODELDIR "/en-us/en-us\"," |
| "lm: \"" MODELDIR "/en-us/en-us.lm.bin\"," |
| "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\"," |
| "fwdtree: true," |
| "fwdflat: false," |
| "bestpath: false," |
| "samprate: 16000")); |
| TEST_EQUAL(0, ps_config_validate(config)); |
| ps_config_free(config); |
| TEST_ASSERT(config = |
| ps_config_parse_json( |
| NULL, |
| "hmm: \"" MODELDIR "/en-us/en-us\"," |
| "lm: \"" MODELDIR "/en-us/en-us.lm.bin\"," |
| "jsgf: \"" DATADIR "/goforward.gram\"," |
| "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\"," |
| "fwdtree: true," |
| "fwdflat: false," |
| "bestpath: false," |
| "samprate: 16000")); |
| TEST_ASSERT(ps_config_validate(config) < 0); |
| ps_config_free(config); |
| TEST_ASSERT(config = |
| ps_config_parse_json( |
| NULL, |
| "hmm: \"" MODELDIR "/en-us/en-us\"," |
| "kws: \"" DATADIR "/goforward.kws\"," |
| "jsgf: \"" DATADIR "/goforward.gram\"," |
| "fsg: \"" DATADIR "/goforward.fsg\"," |
| "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\"," |
| "fwdtree: true," |
| "fwdflat: false," |
| "bestpath: false," |
| "samprate: 16000")); |
| TEST_ASSERT(ps_config_validate(config) < 0); |
| ps_config_free(config); |
| TEST_ASSERT(config = |
| ps_config_parse_json( |
| NULL, |
| "hmm: \"" MODELDIR "/en-us/en-us\"," |
| "keyphrase: \"bonjour alexis\"," |
| "fwdtree: true," |
| "fwdflat: false," |
| "bestpath: false," |
| "samprate: 16000")); |
| TEST_EQUAL(0, ps_config_validate(config)); |
| ps_config_free(config); |
| } |
|
|
| static void |
| test_config_default(void) |
| { |
| ps_config_t *config; |
| TEST_ASSERT(config = ps_config_init(NULL)); |
| setenv("POCKETSPHINX_PATH", MODELDIR, 1); |
| ps_default_search_args(config); |
| TEST_EQUAL(0, strcmp(ps_config_str(config, "hmm"), |
| MODELDIR "/en-us/en-us")); |
| TEST_EQUAL(0, strcmp(ps_config_str(config, "lm"), |
| MODELDIR "/en-us/en-us.lm.bin")); |
| TEST_EQUAL(0, strcmp(ps_config_str(config, "dict"), |
| MODELDIR "/en-us/cmudict-en-us.dict")); |
| ps_config_free(config); |
| } |
|
|
| int |
| main(int argc, char *argv[]) |
| { |
| (void)argc; (void)argv; |
|
|
| test_config_init(); |
| test_config_args(); |
| test_config_json(); |
| test_validate_config(); |
| test_config_default(); |
| |
| return 0; |
| } |
|
|