| | #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; |
| | } |
| |
|