// trace wrappers
TRACE_WRAPPER
char *
trace_ppb_char_set_utf16_to_char_set(PP_Instance instance, const uint16_t *utf16,
                                     uint32_t utf16_len, const char *output_char_set,
                                     enum PP_CharSet_ConversionError on_error,
                                     uint32_t *output_length)
{
    trace_info("[PPB] {full} %s instance=%d, utf16=%p, utf16_len=%u, output_char_set=%s, "
               "on_error=%s\n", __func__+6, instance, utf16, utf16_len, output_char_set,
               reverse_char_set_conversion_error(on_error));
    return ppb_char_set_utf16_to_char_set(instance, utf16, utf16_len, output_char_set, on_error,
                                          output_length);
}
static
void
test_from_utf16(void)
{
    char *res;
    uint32_t res_len;

    printf("from utf16: all ASCII\n");
    {
        const uint16_t in[] = {0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77,
                               0x6f, 0x72, 0x6c, 0x64, 0x21
                              };
        const char *out = "Hello, world!";
        res_len = 7777;
        res = ppb_char_set_utf16_to_char_set(instance, in, sizeof(in) / sizeof(in[0]),
                                             "cp1251", PP_CHARSET_CONVERSIONERROR_FAIL, &res_len);
        assert(res_len == strlen(out));
        assert(memcmp(res, out, res_len) == 0);
        free(res);
    }

    printf("to utf16: non-ASCII all correct\n");
    {
        const uint16_t in[] = {0x41f, 0x440, 0x438, 0x432, 0x435, 0x442, 0x2c,
                               0x20, 0x43c, 0x438, 0x440, 0x21
                              }; // "Привет, мир!"
        const char *out = "\xcf\xf0\xe8\xe2\xe5\xf2\x2c\x20\xec\xe8\xf0\x21"; // "Привет, мир!"
        res_len = 7777;
        res = ppb_char_set_utf16_to_char_set(instance, in, sizeof(in) / sizeof(in[0]),
                                             "cp1251", PP_CHARSET_CONVERSIONERROR_FAIL, &res_len);
        assert(res_len == strlen(out));
        assert(memcmp(res, out, res_len) == 0);
        free(res);
    }

    printf("to utf16: non-ASCII PP_CHARSET_CONVERSIONERROR_FAIL\n");
    {

        const uint16_t in[] = {0x41f, 0x440, 0x438, 0x432, 0x435, 0x442, 0x2c,
                               0x20, 0x266b, 0x43c, 0x438, 0x440, 0x21
                              }; // "Привет, ♫мир!"
        // const char *out = "\xcf\xf0\xe8\xe2\xe5\xf2\x2c\x20\xec\xe8\xf0\x21"; // "Привет, мир!"
        res_len = 7777;
        res = ppb_char_set_utf16_to_char_set(instance, in, sizeof(in) / sizeof(in[0]),
                                             "cp1251", PP_CHARSET_CONVERSIONERROR_FAIL, &res_len);
        assert(res_len == 0);
        assert(res == NULL);
        free(res);
    }

    printf("to utf16: non-ASCII PP_CHARSET_CONVERSIONERROR_SKIP\n");
    {
        const uint16_t in[] = {0x41f, 0x440, 0x438, 0x432, 0x435, 0x442, 0x2c,
                               0x20, 0x266b, 0x43c, 0x438, 0x440, 0x21
                              }; // "Привет, ♫мир!"
        const char *out = "\xcf\xf0\xe8\xe2\xe5\xf2\x2c\x20\xec\xe8\xf0\x21"; // "Привет, мир!"
        res_len = 7777;
        res = ppb_char_set_utf16_to_char_set(instance, in, sizeof(in) / sizeof(in[0]),
                                             "cp1251", PP_CHARSET_CONVERSIONERROR_SKIP, &res_len);
        assert(res_len == strlen(out));
        assert(memcmp(res, out, res_len) == 0);
        free(res);
    }

    printf("to utf16: non-ASCII PP_CHARSET_CONVERSIONERROR_SUBSTITUTE\n");
    {
        const uint16_t in[] = {0x41f, 0x440, 0x438, 0x432, 0x435, 0x442, 0x2c,
                               0x20, 0x266b, 0x43c, 0x438, 0x440, 0x21
                              }; // "Привет, ♫мир!"
        const char *out = "\xcf\xf0\xe8\xe2\xe5\xf2\x2c\x20\x3f\xec\xe8\xf0\x21";// "Привет, ?мир!"
        res_len = 7777;
        res = ppb_char_set_utf16_to_char_set(instance, in, sizeof(in) / sizeof(in[0]),
                                             "cp1251", PP_CHARSET_CONVERSIONERROR_SUBSTITUTE, &res_len);
        assert(res_len == strlen(out));
        assert(memcmp(res, out, res_len) == 0);
        free(res);
    }
}