#include "config.h"
#include <assert.h>
#include <ccan/str/str.h>
#include <ccan/tal/str/str.h>
#include <common/amount.h>
#include <common/json_parse.h>
#include <common/setup.h>
#include <plugins/bkpr/bookkeeper.h>
#include "../report.c"
struct bkpr *bkpr_of(struct plugin *plugin UNNEEDED)
{ fprintf(stderr, "bkpr_of called!\n"); abort(); }
struct command_result *command_check_done(struct command *cmd)
{ fprintf(stderr, "command_check_done called!\n"); abort(); }
bool command_check_only(const struct command *cmd UNNEEDED)
{ fprintf(stderr, "command_check_only called!\n"); abort(); }
bool command_deprecated_in_ok(struct command *cmd UNNEEDED,
const char *param UNNEEDED,
const char *depr_start UNNEEDED,
const char *depr_end UNNEEDED)
{ fprintf(stderr, "command_deprecated_in_ok called!\n"); abort(); }
bool command_dev_apis(const struct command *cmd UNNEEDED)
{ fprintf(stderr, "command_dev_apis called!\n"); abort(); }
struct command_result *command_fail(struct command *cmd UNNEEDED, enum jsonrpc_errcode code UNNEEDED,
const char *fmt UNNEEDED, ...)
{ fprintf(stderr, "command_fail called!\n"); abort(); }
struct json_filter **command_filter_ptr(struct command *cmd UNNEEDED)
{ fprintf(stderr, "command_filter_ptr called!\n"); abort(); }
struct command_result *command_finished(struct command *cmd UNNEEDED, struct json_stream *response)
{ fprintf(stderr, "command_finished called!\n"); abort(); }
void command_log(struct command *cmd UNNEEDED, enum log_level level UNNEEDED,
const char *fmt UNNEEDED, ...)
{ fprintf(stderr, "command_log called!\n"); abort(); }
void command_set_usage(struct command *cmd UNNEEDED, const char *usage UNNEEDED)
{ fprintf(stderr, "command_set_usage called!\n"); abort(); }
bool command_usage_only(const struct command *cmd UNNEEDED)
{ fprintf(stderr, "command_usage_only called!\n"); abort(); }
const char *currencyrate_str(const tal_t *ctx UNNEEDED,
const struct bkpr *bkpr UNNEEDED,
u64 timestamp UNNEEDED,
const struct amount_msat *msat UNNEEDED)
{ fprintf(stderr, "currencyrate_str called!\n"); abort(); }
struct json_stream *jsonrpc_stream_success(struct command *cmd)
{ fprintf(stderr, "jsonrpc_stream_success called!\n"); abort(); }
struct income_event **list_income_events(const tal_t *ctx UNNEEDED,
const struct bkpr *bkpr UNNEEDED,
struct command *cmd UNNEEDED,
u64 start_time UNNEEDED,
u64 end_time UNNEEDED,
bool consolidate_fees UNNEEDED)
{ fprintf(stderr, "list_income_events called!\n"); abort(); }
static void test_format_event_literal_only(void)
{
struct report_format *f = tal(tmpctx, struct report_format);
struct income_event *e = tal(tmpctx, struct income_event);
struct bkpr *bkpr = tal(tmpctx, struct bkpr);
char *s;
f->fmt = tal_arr(f, typeof(*f->fmt), 1);
f->str = tal_arr(f, const char *, 1);
f->alt = tal_arr(f, struct report_format *, 1);
f->fmt[0] = NULL;
f->str[0] = tal_strdup(f->str, "hello");
f->alt[0] = NULL;
s = format_event(tmpctx, f, REPORT_FMT_NONE, bkpr, e);
assert(streq(s, "hello"));
}
static void test_format_event_simple_tag(void)
{
struct report_format *f = tal(tmpctx, struct report_format);
struct income_event *e = tal(tmpctx, struct income_event);
struct bkpr *bkpr = tal(tmpctx, struct bkpr);
char *s;
e->tag = "invoice";
f->fmt = tal_arr(f, typeof(*f->fmt), 3);
f->str = tal_arr(f, const char *, 3);
f->alt = tal_arr(f, struct report_format *, 3);
f->fmt[0] = NULL;
f->str[0] = tal_strdup(f->str, "tag=");
f->alt[0] = NULL;
f->fmt[1] = report_fmt_tag;
f->str[1] = NULL;
f->alt[1] = NULL;
f->fmt[2] = NULL;
f->str[2] = tal_strdup(f->str, "!");
f->alt[2] = NULL;
s = format_event(tmpctx, f, REPORT_FMT_NONE, bkpr, e);
assert(streq(s, "tag=invoice!"));
}
static void test_format_event_fallback(void)
{
struct report_format *f = tal(tmpctx, struct report_format);
struct report_format *alt = tal(f, struct report_format);
struct income_event *e = tal(tmpctx, struct income_event);
struct bkpr *bkpr = tal(tmpctx, struct bkpr);
char *s;
alt->fmt = tal_arr(alt, typeof(*alt->fmt), 1);
alt->str = tal_arr(alt, const char *, 1);
alt->alt = tal_arr(alt, struct report_format *, 1);
alt->fmt[0] = NULL;
alt->str[0] = tal_strdup(alt->str, "NONE");
alt->alt[0] = NULL;
f->fmt = tal_arr(f, typeof(*f->fmt), 1);
f->str = tal_arr(f, const char *, 1);
f->alt = tal_arr(f, struct report_format *, 1);
f->fmt[0] = report_fmt_payment_id;
f->str[0] = NULL;
f->alt[0] = alt;
e->payment_id = NULL;
s = format_event(tmpctx, f, REPORT_FMT_NONE, bkpr, e);
assert(streq(s, "NONE"));
}
static void test_format_event_nested_fallback(void)
{
struct report_format *f = tal(tmpctx, struct report_format);
struct report_format *alt1 = tal(f, struct report_format);
struct report_format *alt2 = tal(f, struct report_format);
struct income_event *e = tal(tmpctx, struct income_event);
struct bkpr *bkpr = tal(tmpctx, struct bkpr);
char *s;
e->txid = NULL;
e->desc = NULL;
alt2->fmt = tal_arr(alt2, typeof(*alt2->fmt), 1);
alt2->str = tal_arr(alt2, const char *, 1);
alt2->alt = tal_arr(alt2, struct report_format *, 1);
alt2->fmt[0] = NULL;
alt2->str[0] = tal_strdup(alt2->str, "LAST");
alt2->alt[0] = NULL;
alt1->fmt = tal_arr(alt1, typeof(*alt1->fmt), 1);
alt1->str = tal_arr(alt1, const char *, 1);
alt1->alt = tal_arr(alt1, struct report_format *, 1);
alt1->fmt[0] = report_fmt_txid;
alt1->str[0] = NULL;
alt1->alt[0] = alt2;
f->fmt = tal_arr(f, typeof(*f->fmt), 1);
f->str = tal_arr(f, const char *, 1);
f->alt = tal_arr(f, struct report_format *, 1);
f->fmt[0] = report_fmt_desc;
f->str[0] = NULL;
f->alt[0] = alt1;
s = format_event(tmpctx, f, REPORT_FMT_NONE, bkpr, e);
assert(streq(s, "LAST"));
}
static void test_format_event_csv_escape_value(void)
{
struct report_format *f = tal(tmpctx, struct report_format);
struct income_event *e = tal(tmpctx, struct income_event);
struct bkpr *bkpr = tal(tmpctx, struct bkpr);
char *s;
e->desc = "hello, \"world\"";
f->fmt = tal_arr(f, typeof(*f->fmt), 1);
f->str = tal_arr(f, const char *, 1);
f->alt = tal_arr(f, struct report_format *, 1);
f->fmt[0] = report_fmt_desc;
f->str[0] = NULL;
f->alt[0] = NULL;
s = format_event(tmpctx, f, REPORT_FMT_CSV, bkpr, e);
assert(streq(s, "\"hello, \"\"world\"\"\""));
}
static void test_format_event_missing_no_fallback(void)
{
struct report_format *f = tal(tmpctx, struct report_format);
struct income_event *e = tal(tmpctx, struct income_event);
struct bkpr *bkpr = tal(tmpctx, struct bkpr);
char *s;
e->payment_id = NULL;
f->fmt = tal_arr(f, typeof(*f->fmt), 3);
f->str = tal_arr(f, const char *, 3);
f->alt = tal_arr(f, struct report_format *, 3);
f->fmt[0] = NULL;
f->str[0] = tal_strdup(f->str, "A");
f->alt[0] = NULL;
f->fmt[1] = report_fmt_payment_id;
f->str[1] = NULL;
f->alt[1] = NULL;
f->fmt[2] = NULL;
f->str[2] = tal_strdup(f->str, "B");
f->alt[2] = NULL;
s = format_event(tmpctx, f, REPORT_FMT_NONE, bkpr, e);
assert(streq(s, "AB"));
}
int main(int argc, char *argv[])
{
common_setup(argv[0]);
test_format_event_literal_only();
test_format_event_simple_tag();
test_format_event_fallback();
test_format_event_nested_fallback();
test_format_event_csv_escape_value();
test_format_event_missing_no_fallback();
common_shutdown();
}