|
@@ -641,6 +641,46 @@ public abstract class AbstractFunctionTestCase extends ESTestCase {
|
|
|
Matcher<String> evaluatorToString(int nullPosition, TestCaseSupplier.TypedData nullData, Matcher<String> original);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Modifies suppliers to generate BytesRefs with random offsets.
|
|
|
+ */
|
|
|
+ protected static List<TestCaseSupplier> randomizeBytesRefsOffset(List<TestCaseSupplier> testCaseSuppliers) {
|
|
|
+ return testCaseSuppliers.stream().map(supplier -> new TestCaseSupplier(supplier.name(), supplier.types(), () -> {
|
|
|
+ var testCase = supplier.supplier().get();
|
|
|
+
|
|
|
+ var newData = testCase.getData().stream().map(typedData -> {
|
|
|
+ if (typedData.data() instanceof BytesRef bytesRef) {
|
|
|
+ var offset = randomIntBetween(0, 10);
|
|
|
+ var extraLength = randomIntBetween(0, 10);
|
|
|
+ var newBytesArray = randomByteArrayOfLength(bytesRef.length + offset + extraLength);
|
|
|
+
|
|
|
+ System.arraycopy(bytesRef.bytes, bytesRef.offset, newBytesArray, offset, bytesRef.length);
|
|
|
+
|
|
|
+ var newBytesRef = new BytesRef(newBytesArray, offset, bytesRef.length);
|
|
|
+ var newTypedData = new TestCaseSupplier.TypedData(newBytesRef, typedData.type(), typedData.name());
|
|
|
+
|
|
|
+ if (typedData.isForceLiteral()) {
|
|
|
+ newTypedData.forceLiteral();
|
|
|
+ }
|
|
|
+
|
|
|
+ return newTypedData;
|
|
|
+ }
|
|
|
+ return typedData;
|
|
|
+ }).toList();
|
|
|
+
|
|
|
+ return new TestCaseSupplier.TestCase(
|
|
|
+ newData,
|
|
|
+ testCase.evaluatorToString(),
|
|
|
+ testCase.expectedType(),
|
|
|
+ testCase.getMatcher(),
|
|
|
+ testCase.getExpectedWarnings(),
|
|
|
+ testCase.getExpectedTypeError(),
|
|
|
+ testCase.foldingExceptionClass(),
|
|
|
+ testCase.foldingExceptionMessage()
|
|
|
+ );
|
|
|
+ })).toList();
|
|
|
+ }
|
|
|
+
|
|
|
protected static List<TestCaseSupplier> anyNullIsNull(
|
|
|
List<TestCaseSupplier> testCaseSuppliers,
|
|
|
ExpectedType expectedType,
|