@@ -309,4 +309,62 @@ TEST(TestStringOps, TestReverse) {
309309 ctx.Reset ();
310310}
311311
312+ TEST (TestStringOps, TestLocate) {
313+ gandiva::ExecutionContext ctx;
314+ uint64_t ctx_ptr = reinterpret_cast <int64>(&ctx);
315+
316+ int pos;
317+
318+ pos = locate_utf8_utf8 (ctx_ptr, " String" , 6 , " TestString" , 10 );
319+ EXPECT_EQ (pos, 5 );
320+ EXPECT_FALSE (ctx.has_error ());
321+
322+ pos = locate_utf8_utf8_int32 (ctx_ptr, " String" , 6 , " TestString" , 10 , 1 );
323+ EXPECT_EQ (pos, 5 );
324+ EXPECT_FALSE (ctx.has_error ());
325+
326+ pos = locate_utf8_utf8_int32 (ctx_ptr, " abc" , 3 , " abcabc" , 6 , 2 );
327+ EXPECT_EQ (pos, 4 );
328+ EXPECT_FALSE (ctx.has_error ());
329+
330+ pos = locate_utf8_utf8 (ctx_ptr, " çåå" , 6 , " s†å†emçåå†d" , 21 );
331+ EXPECT_EQ (pos, 7 );
332+ EXPECT_FALSE (ctx.has_error ());
333+
334+ pos = locate_utf8_utf8_int32 (ctx_ptr, " bar" , 3 , " †barbar" , 9 , 3 );
335+ EXPECT_EQ (pos, 5 );
336+ EXPECT_FALSE (ctx.has_error ());
337+
338+ pos = locate_utf8_utf8_int32 (ctx_ptr, " sub" , 3 , " " , 0 , 1 );
339+ EXPECT_EQ (pos, 0 );
340+ EXPECT_FALSE (ctx.has_error ());
341+
342+ pos = locate_utf8_utf8_int32 (ctx_ptr, " " , 0 , " str" , 3 , 1 );
343+ EXPECT_EQ (pos, 0 );
344+ EXPECT_FALSE (ctx.has_error ());
345+
346+ pos = locate_utf8_utf8_int32 (ctx_ptr, " bar" , 3 , " barbar" , 6 , 0 );
347+ EXPECT_EQ (pos, 0 );
348+ EXPECT_THAT (ctx.get_error (),
349+ ::testing::HasSubstr (" Start position must be greater than 0" ));
350+ ctx.Reset ();
351+
352+ pos = locate_utf8_utf8_int32 (ctx_ptr, " bar" , 3 , " barbar" , 6 , 7 );
353+ EXPECT_EQ (pos, 0 );
354+ EXPECT_THAT (ctx.get_error (),
355+ ::testing::HasSubstr (" Invalid character position argument" ));
356+ ctx.Reset ();
357+
358+ std::string d (
359+ " a\xff "
360+ " c" );
361+ pos =
362+ locate_utf8_utf8_int32 (ctx_ptr, " c" , 1 , d.data (), static_cast <int >(d.length ()), 3 );
363+ EXPECT_EQ (pos, 0 );
364+ EXPECT_THAT (ctx.get_error (),
365+ ::testing::HasSubstr (
366+ " unexpected byte \\ ff encountered while decoding utf8 string" ));
367+ ctx.Reset ();
368+ }
369+
312370} // namespace gandiva
0 commit comments