+static int test_check_null_numbers(void)
+{
+#if defined(_BSD_SOURCE) \
+ || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L) \
+ || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 600)
+ long val = 0;
+
+ /* Verify that a NULL config with a present environment variable returns
+ * success and the value.
+ */
+ if (!TEST_int_eq(setenv("FNORD", "123", 1), 0)
+ || !TEST_true(NCONF_get_number(NULL, "missing", "FNORD", &val))
+ || !TEST_long_eq(val, 123)) {
+ TEST_note("environment variable with NULL conf failed");
+ return 0;
+ }
+
+ /*
+ * Verify that a NULL config with a missing environment variable returns
+ * a failure code.
+ */
+ if (!TEST_int_eq(unsetenv("FNORD"), 0)
+ || !TEST_false(NCONF_get_number(NULL, "missing", "FNORD", &val))) {
+ TEST_note("missing environment variable with NULL conf failed");
+ return 0;
+ }
+#endif
+ return 1;
+}
+
+static int test_check_overflow(void)
+{
+#if defined(_BSD_SOURCE) \
+ || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L) \
+ || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 600)
+ long val = 0;
+ char max[(sizeof(long) * 8) / 3 + 3];
+ char *p;
+
+ p = max + sprintf(max, "0%ld", LONG_MAX) - 1;
+ setenv("FNORD", max, 1);
+ if (!TEST_true(NCONF_get_number(NULL, "missing", "FNORD", &val))
+ || !TEST_long_eq(val, LONG_MAX))
+ return 0;
+
+ while (++*p > '9')
+ *p-- = '0';
+
+ setenv("FNORD", max, 1);
+ if (!TEST_false(NCONF_get_number(NULL, "missing", "FNORD", &val)))
+ return 0;
+#endif
+ return 1;
+}
+
+typedef enum OPTION_choice {
+ OPT_ERR = -1,
+ OPT_EOF = 0,
+ OPT_FAIL,
+ OPT_TEST_ENUM
+} OPTION_CHOICE;
+
+const OPTIONS *test_get_options(void)
+{
+ static const OPTIONS test_options[] = {
+ OPT_TEST_OPTIONS_WITH_EXTRA_USAGE("conf_file\n"),
+ { "f", OPT_FAIL, '-', "A failure is expected" },
+ { NULL }
+ };
+ return test_options;
+}
+