blob: 02c6c75d570e716f6068ed6e0a9080ea705b2d63 [file] [log] [blame]
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define C_LUCY_TESTCHARBUF
#include "Lucy/Util/ToolSet.h"
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
#include "Lucy/Test.h"
#include "Lucy/Test/TestUtils.h"
#include "Lucy/Test/Object/TestCharBuf.h"
static char smiley[] = { (char)0xE2, (char)0x98, (char)0xBA, 0 };
static uint32_t smiley_len = 3;
static CharBuf*
S_get_cb(char *string) {
return CB_new_from_utf8(string, strlen(string));
}
static void
test_Cat(TestBatch *batch) {
CharBuf *wanted = CB_newf("a%s", smiley);
CharBuf *got = S_get_cb("");
CB_Cat(got, wanted);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "Cat");
DECREF(got);
got = S_get_cb("a");
CB_Cat_Char(got, 0x263A);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "Cat_Char");
DECREF(got);
got = S_get_cb("a");
CB_Cat_Str(got, smiley, smiley_len);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "Cat_Str");
DECREF(got);
got = S_get_cb("a");
CB_Cat_Trusted_Str(got, smiley, smiley_len);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "Cat_Trusted_Str");
DECREF(got);
DECREF(wanted);
}
static void
test_Mimic_and_Clone(TestBatch *batch) {
CharBuf *wanted = S_get_cb("foo");
CharBuf *got = S_get_cb("bar");
CB_Mimic(got, (Obj*)wanted);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "Mimic");
DECREF(got);
got = S_get_cb("bar");
CB_Mimic_Str(got, "foo", 3);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "Mimic_Str");
DECREF(got);
got = CB_Clone(wanted);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "Clone");
DECREF(got);
DECREF(wanted);
}
static void
test_Find(TestBatch *batch) {
CharBuf *string = CB_new(10);
CharBuf *substring = S_get_cb("foo");
TEST_TRUE(batch, CB_Find(string, substring) == -1, "Not in empty string");
CB_setf(string, "foo");
TEST_TRUE(batch, CB_Find(string, substring) == 0, "Find complete string");
CB_setf(string, "afoo");
TEST_TRUE(batch, CB_Find(string, substring) == 1, "Find after first");
CB_Set_Size(string, 3);
TEST_TRUE(batch, CB_Find(string, substring) == -1, "Don't overrun");
CB_setf(string, "afood");
TEST_TRUE(batch, CB_Find(string, substring) == 1, "Find in middle");
DECREF(substring);
DECREF(string);
}
static void
test_Code_Point_At_and_From(TestBatch *batch) {
uint32_t code_points[] = { 'a', 0x263A, 0x263A, 'b', 0x263A, 'c' };
uint32_t num_code_points = sizeof(code_points) / sizeof(uint32_t);
CharBuf *string = CB_newf("a%s%sb%sc", smiley, smiley, smiley);
uint32_t i;
for (i = 0; i < num_code_points; i++) {
uint32_t from = num_code_points - i - 1;
TEST_INT_EQ(batch, CB_Code_Point_At(string, i), code_points[i],
"Code_Point_At %ld", (long)i);
TEST_INT_EQ(batch, CB_Code_Point_At(string, from),
code_points[from], "Code_Point_From %ld", (long)from);
}
DECREF(string);
}
static void
test_SubString(TestBatch *batch) {
CharBuf *string = CB_newf("a%s%sb%sc", smiley, smiley, smiley);
CharBuf *wanted = CB_newf("%sb%s", smiley, smiley);
CharBuf *got = CB_SubString(string, 2, 3);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "SubString");
DECREF(wanted);
DECREF(got);
DECREF(string);
}
static void
test_Nip_and_Chop(TestBatch *batch) {
CharBuf *wanted;
CharBuf *got;
wanted = CB_newf("%sb%sc", smiley, smiley);
got = CB_newf("a%s%sb%sc", smiley, smiley, smiley);
CB_Nip(got, 2);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "Nip");
DECREF(wanted);
DECREF(got);
wanted = CB_newf("a%s%s", smiley, smiley);
got = CB_newf("a%s%sb%sc", smiley, smiley, smiley);
CB_Chop(got, 3);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "Chop");
DECREF(wanted);
DECREF(got);
}
static void
test_Truncate(TestBatch *batch) {
CharBuf *wanted = CB_newf("a%s", smiley, smiley);
CharBuf *got = CB_newf("a%s%sb%sc", smiley, smiley, smiley);
CB_Truncate(got, 2);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "Truncate");
DECREF(wanted);
DECREF(got);
}
static void
test_Trim(TestBatch *batch) {
uint32_t spaces[] = {
' ', '\t', '\r', '\n', 0x000B, 0x000C, 0x000D, 0x0085,
0x00A0, 0x1680, 0x180E, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004,
0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x2028, 0x2029,
0x202F, 0x205F, 0x3000
};
uint32_t num_spaces = sizeof(spaces) / sizeof(uint32_t);
uint32_t i;
CharBuf *got = CB_new(0);
// Surround a smiley with lots of whitespace.
for (i = 0; i < num_spaces; i++) { CB_Cat_Char(got, spaces[i]); }
CB_Cat_Char(got, 0x263A);
for (i = 0; i < num_spaces; i++) { CB_Cat_Char(got, spaces[i]); }
TEST_TRUE(batch, CB_Trim_Top(got), "Trim_Top returns true on success");
TEST_FALSE(batch, CB_Trim_Top(got),
"Trim_Top returns false on failure");
TEST_TRUE(batch, CB_Trim_Tail(got), "Trim_Tail returns true on success");
TEST_FALSE(batch, CB_Trim_Tail(got),
"Trim_Tail returns false on failure");
TEST_TRUE(batch, CB_Equals_Str(got, smiley, smiley_len),
"Trim_Top and Trim_Tail worked");
// Build the spacey smiley again.
CB_Truncate(got, 0);
for (i = 0; i < num_spaces; i++) { CB_Cat_Char(got, spaces[i]); }
CB_Cat_Char(got, 0x263A);
for (i = 0; i < num_spaces; i++) { CB_Cat_Char(got, spaces[i]); }
TEST_TRUE(batch, CB_Trim(got), "Trim returns true on success");
TEST_FALSE(batch, CB_Trim(got), "Trim returns false on failure");
TEST_TRUE(batch, CB_Equals_Str(got, smiley, smiley_len),
"Trim worked");
DECREF(got);
}
static void
test_To_F64(TestBatch *batch) {
CharBuf *charbuf = S_get_cb("1.5");
double difference = 1.5 - CB_To_F64(charbuf);
if (difference < 0) { difference = 0 - difference; }
TEST_TRUE(batch, difference < 0.001, "To_F64");
CB_setf(charbuf, "-1.5");
difference = 1.5 + CB_To_F64(charbuf);
if (difference < 0) { difference = 0 - difference; }
TEST_TRUE(batch, difference < 0.001, "To_F64 negative");
CB_setf(charbuf, "1.59");
double value_full = CB_To_F64(charbuf);
CB_Set_Size(charbuf, 3);
double value_short = CB_To_F64(charbuf);
TEST_TRUE(batch, value_short < value_full,
"TO_F64 doesn't run past end of string");
DECREF(charbuf);
}
static void
test_To_I64(TestBatch *batch) {
CharBuf *charbuf = S_get_cb("10");
TEST_TRUE(batch, CB_To_I64(charbuf) == 10, "To_I64");
CB_setf(charbuf, "-10");
TEST_TRUE(batch, CB_To_I64(charbuf) == -10, "To_I64 negative");
DECREF(charbuf);
}
static void
test_vcatf_s(TestBatch *batch) {
CharBuf *wanted = S_get_cb("foo bar bizzle baz");
CharBuf *got = S_get_cb("foo ");
CB_catf(got, "bar %s baz", "bizzle");
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "%%s");
DECREF(wanted);
DECREF(got);
}
static void
test_vcatf_null_string(TestBatch *batch) {
CharBuf *wanted = S_get_cb("foo bar [NULL] baz");
CharBuf *got = S_get_cb("foo ");
CB_catf(got, "bar %s baz", NULL);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "%%s NULL");
DECREF(wanted);
DECREF(got);
}
static void
test_vcatf_cb(TestBatch *batch) {
CharBuf *wanted = S_get_cb("foo bar ZEKE baz");
CharBuf *catworthy = S_get_cb("ZEKE");
CharBuf *got = S_get_cb("foo ");
CB_catf(got, "bar %o baz", catworthy);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "%%o CharBuf");
DECREF(catworthy);
DECREF(wanted);
DECREF(got);
}
static void
test_vcatf_obj(TestBatch *batch) {
CharBuf *wanted = S_get_cb("ooga 20 booga");
Integer32 *i32 = Int32_new(20);
CharBuf *got = S_get_cb("ooga");
CB_catf(got, " %o booga", i32);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "%%o Obj");
DECREF(i32);
DECREF(wanted);
DECREF(got);
}
static void
test_vcatf_null_obj(TestBatch *batch) {
CharBuf *wanted = S_get_cb("foo bar [NULL] baz");
CharBuf *got = S_get_cb("foo ");
CB_catf(got, "bar %o baz", NULL);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "%%o NULL");
DECREF(wanted);
DECREF(got);
}
static void
test_vcatf_i8(TestBatch *batch) {
CharBuf *wanted = S_get_cb("foo bar -3 baz");
int8_t num = -3;
CharBuf *got = S_get_cb("foo ");
CB_catf(got, "bar %i8 baz", num);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "%%i8");
DECREF(wanted);
DECREF(got);
}
static void
test_vcatf_i32(TestBatch *batch) {
CharBuf *wanted = S_get_cb("foo bar -100000 baz");
int32_t num = -100000;
CharBuf *got = S_get_cb("foo ");
CB_catf(got, "bar %i32 baz", num);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "%%i32");
DECREF(wanted);
DECREF(got);
}
static void
test_vcatf_i64(TestBatch *batch) {
CharBuf *wanted = S_get_cb("foo bar -5000000000 baz");
int64_t num = I64_C(-5000000000);
CharBuf *got = S_get_cb("foo ");
CB_catf(got, "bar %i64 baz", num);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "%%i64");
DECREF(wanted);
DECREF(got);
}
static void
test_vcatf_u8(TestBatch *batch) {
CharBuf *wanted = S_get_cb("foo bar 3 baz");
uint8_t num = 3;
CharBuf *got = S_get_cb("foo ");
CB_catf(got, "bar %u8 baz", num);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "%%u8");
DECREF(wanted);
DECREF(got);
}
static void
test_vcatf_u32(TestBatch *batch) {
CharBuf *wanted = S_get_cb("foo bar 100000 baz");
uint32_t num = 100000;
CharBuf *got = S_get_cb("foo ");
CB_catf(got, "bar %u32 baz", num);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "%%u32");
DECREF(wanted);
DECREF(got);
}
static void
test_vcatf_u64(TestBatch *batch) {
CharBuf *wanted = S_get_cb("foo bar 5000000000 baz");
uint64_t num = U64_C(5000000000);
CharBuf *got = S_get_cb("foo ");
CB_catf(got, "bar %u64 baz", num);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "%%u64");
DECREF(wanted);
DECREF(got);
}
static void
test_vcatf_f64(TestBatch *batch) {
CharBuf *wanted;
char buf[64];
float num = 1.3f;
CharBuf *got = S_get_cb("foo ");
sprintf(buf, "foo bar %g baz", num);
wanted = CB_new_from_trusted_utf8(buf, strlen(buf));
CB_catf(got, "bar %f64 baz", num);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "%%f64");
DECREF(wanted);
DECREF(got);
}
static void
test_vcatf_x32(TestBatch *batch) {
CharBuf *wanted;
char buf[64];
unsigned long num = I32_MAX;
CharBuf *got = S_get_cb("foo ");
#if (SIZEOF_LONG == 4)
sprintf(buf, "foo bar %.8lx baz", num);
#elif (SIZEOF_INT == 4)
sprintf(buf, "foo bar %.8x baz", (unsigned)num);
#endif
wanted = CB_new_from_trusted_utf8(buf, strlen(buf));
CB_catf(got, "bar %x32 baz", (uint32_t)num);
TEST_TRUE(batch, CB_Equals(wanted, (Obj*)got), "%%x32");
DECREF(wanted);
DECREF(got);
}
static void
test_serialization(TestBatch *batch) {
CharBuf *wanted = S_get_cb("foo");
CharBuf *got = (CharBuf*)TestUtils_freeze_thaw((Obj*)wanted);
TEST_TRUE(batch, got && CB_Equals(wanted, (Obj*)got),
"Round trip through FREEZE/THAW");
DECREF(got);
DECREF(wanted);
}
void
TestCB_run_tests() {
TestBatch *batch = TestBatch_new(55);
TestBatch_Plan(batch);
test_vcatf_s(batch);
test_vcatf_null_string(batch);
test_vcatf_cb(batch);
test_vcatf_obj(batch);
test_vcatf_null_obj(batch);
test_vcatf_i8(batch);
test_vcatf_i32(batch);
test_vcatf_i64(batch);
test_vcatf_u8(batch);
test_vcatf_u32(batch);
test_vcatf_u64(batch);
test_vcatf_f64(batch);
test_vcatf_x32(batch);
test_Cat(batch);
test_Mimic_and_Clone(batch);
test_Code_Point_At_and_From(batch);
test_Find(batch);
test_SubString(batch);
test_Nip_and_Chop(batch);
test_Truncate(batch);
test_Trim(batch);
test_To_F64(batch);
test_To_I64(batch);
test_serialization(batch);
DECREF(batch);
}