Nomad changes
All checks were successful
Deploy fil (kreuzberg) / deploy (push) Successful in 49s

This commit is contained in:
Henrik Jess Nielsen
2026-06-01 23:40:55 +02:00
parent 72b1a0a6ed
commit b4c07d3693
5723 changed files with 1130655 additions and 0 deletions

68
e2e/dart/test/async_test.dart generated Normal file
View File

@@ -0,0 +1,68 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'dart:io';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
// E2e tests for category: async
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
final _testDocs = Platform.environment['FIXTURES_DIR'] ?? '../../test_documents';
final _dir = Directory(_testDocs);
if (_dir.existsSync()) Directory.current = _dir;
});
test('Async extract_bytes call on PDF document', () async {
final result = await KreuzbergBridge.extractBytes(File('pdf/fake_memo.pdf').readAsBytesSync(), 'application/pdf');
expect(result.mimeType.toString().trim(), equals('application/pdf'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(50));
});
test('extract_bytes empty MIME async', () async {
await expectLater(KreuzbergBridge.extractBytes(File('text/plain.txt').readAsBytesSync(), ''), throwsA(anything));
});
test('extract_bytes unsupported MIME async', () async {
await expectLater(KreuzbergBridge.extractBytes(File('text/plain.txt').readAsBytesSync(), 'application/x-nonexistent'), throwsA(anything));
});
}

71
e2e/dart/test/batch_test.dart generated Normal file
View File

@@ -0,0 +1,71 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
import 'dart:convert';
// E2e tests for category: batch
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
});
test('Extract text from multiple files asynchronously', () async {
final result = await KreuzbergBridge.batchExtractFiles([BatchFileItem(path: 'pdf/fake_memo.pdf'), BatchFileItem(path: 'text/fake_text.txt')]);
});
test('batch_extract_file async nonexistent', () async {
final result = await KreuzbergBridge.batchExtractFiles([BatchFileItem(path: '/nonexistent/a.pdf')]);
});
test('batch_extract_file_sync nonexistent', () async {
final result = await KreuzbergBridge.batchExtractFilesSync([BatchFileItem(path: '/nonexistent/a.pdf'), BatchFileItem(path: '/nonexistent/b.txt')]);
});
test('batch_extract_file_sync mixed', () async {
final result = await KreuzbergBridge.batchExtractFilesSync([BatchFileItem(path: 'text/plain.txt'), BatchFileItem(path: '/nonexistent/missing.pdf')]);
});
test('Extract text from multiple files synchronously', () async {
final result = await KreuzbergBridge.batchExtractFilesSync([BatchFileItem(path: 'pdf/fake_memo.pdf'), BatchFileItem(path: 'text/fake_text.txt')]);
});
}

62
e2e/dart/test/code_test.dart generated Normal file
View File

@@ -0,0 +1,62 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'dart:io';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
// E2e tests for category: code
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
final _testDocs = Platform.environment['FIXTURES_DIR'] ?? '../../test_documents';
final _dir = Directory(_testDocs);
if (_dir.existsSync()) Directory.current = _dir;
});
test('Test language detection from shebang line via bytes input', () async {
final result = await KreuzbergBridge.extractFileSync('code/script.sh', 'text/x-source-code');
expect(result.mimeType.toString().trim(), equals('text/x-source-code'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(10));
expect(result.content, contains('build'));
expect(result.content, contains('clean'));
});
}

184
e2e/dart/test/contract_test.dart generated Normal file
View File

@@ -0,0 +1,184 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'dart:io';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
// E2e tests for category: contract
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
final _testDocs = Platform.environment['FIXTURES_DIR'] ?? '../../test_documents';
final _dir = Directory(_testDocs);
if (_dir.existsSync()) Directory.current = _dir;
});
test('Tests async batch bytes extraction API (batch_extract_bytes)', () async {
final result = await KreuzbergBridge.extractBytes(File('pdf/fake_memo.pdf').readAsBytesSync(), 'application/pdf');
expect(result.mimeType.toString().trim(), equals('application/pdf'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(10));
expect(result.content.contains('May 5, 2023') || result.content.contains('Mallori'), isTrue);
});
test('Tests async batch bytes extraction with per-file configs (batch_extract_bytes with file_configs parameter)', () async {
final _config = await createExtractionConfigFromJson(json: '{"output_format":"markdown"}');
final result = await KreuzbergBridge.extractBytes(File('pdf/fake_memo.pdf').readAsBytesSync(), 'application/pdf', _config);
expect(result.mimeType.toString().trim(), equals('application/pdf'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(10));
// skipped: field 'metadata.output_format' not available on dart result type
});
test('Tests async batch file extraction API (batch_extract_file)', () async {
final result = await KreuzbergBridge.extractBytes(File('pdf/fake_memo.pdf').readAsBytesSync(), 'application/pdf');
expect(result.mimeType.toString().trim(), equals('application/pdf'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(10));
expect(result.content.contains('May 5, 2023') || result.content.contains('Mallori'), isTrue);
});
test('Tests async batch file extraction with per-file configs (batch_extract_files with file_configs parameter)', () async {
final _config = await createExtractionConfigFromJson(json: '{"output_format":"markdown"}');
final result = await KreuzbergBridge.extractBytes(File('pdf/fake_memo.pdf').readAsBytesSync(), 'application/pdf', _config);
expect(result.mimeType.toString().trim(), equals('application/pdf'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(10));
// skipped: field 'metadata.output_format' not available on dart result type
});
test('Tests async bytes extraction API (extract_bytes)', () async {
final result = await KreuzbergBridge.extractBytes(File('pdf/fake_memo.pdf').readAsBytesSync(), 'application/pdf');
expect(result.mimeType.toString().trim(), equals('application/pdf'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(10));
expect(result.content.contains('May 5, 2023') || result.content.contains('Mallori'), isTrue);
});
test('Tests async file extraction API (extract_file)', () async {
final result = await KreuzbergBridge.extractBytes(File('pdf/fake_memo.pdf').readAsBytesSync(), 'application/pdf');
expect(result.mimeType.toString().trim(), equals('application/pdf'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(10));
expect(result.content.contains('May 5, 2023') || result.content.contains('Mallori'), isTrue);
});
test('Tests markdown chunker prepends heading hierarchy to chunk content', () async {
final _config = await createExtractionConfigFromJson(json: '{"chunking":{"chunker_type":"markdown","max_chars":300,"max_overlap":50,"prepend_heading_context":true}}');
final result = await KreuzbergBridge.extractBytesSync(File('markdown/extraction_test.md').readAsBytesSync(), 'text/markdown', _config);
expect(result.content.length, greaterThanOrEqualTo(10));
// skipped: field 'chunks' not available on dart result type
// skipped: field 'chunks_have_content' not available on dart result type
// skipped: field 'chunks_have_heading_context' not available on dart result type
// skipped: field 'first_chunk_starts_with_heading' not available on dart result type
});
test('Tests document structure with DOCX heading-driven nesting', () async {
final result = await KreuzbergBridge.extractBytesSync(File('docx/fake.docx').readAsBytesSync(), 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', ExtractionConfig(useCache: true, enableQualityProcessing: true, forceOcr: false, disableOcr: false, resultFormat: ResultFormat.unified, outputFormat: OutputFormat.plain(), includeDocumentStructure: true, useLayoutForMarkdown: false, maxArchiveDepth: 3));
expect(result.mimeType.toString().trim(), equals('application/vnd.openxmlformats-officedocument.wordprocessingml.document'.toString().trim()));
// skipped: field 'document' not available on dart result type
// skipped: field 'document.nodes' not available on dart result type
});
test('Tests element-based result format with element type assertions on DOCX', () async {
final _config = await createExtractionConfigFromJson(json: '{"result_format":"element_based"}');
final result = await KreuzbergBridge.extractBytesSync(File('docx/unit_test_headers.docx').readAsBytesSync(), 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', _config);
expect(result.mimeType.contains('application/vnd.openxmlformats-officedocument.wordprocessingml.document'), isTrue);
// skipped: field 'elements' not available on dart result type
});
test('Tests that extraction_timeout_secs config field is accepted and does not affect fast extractions', () async {
final result = await KreuzbergBridge.extractBytesSync(File('pdf/fake_memo.pdf').readAsBytesSync(), 'application/pdf', ExtractionConfig(useCache: true, enableQualityProcessing: true, forceOcr: false, disableOcr: false, resultFormat: ResultFormat.unified, outputFormat: OutputFormat.plain(), includeDocumentStructure: false, useLayoutForMarkdown: false, maxArchiveDepth: 3));
expect(result.mimeType.toString().trim(), equals('application/pdf'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(10));
});
test('Tests keyword extraction via YAKE algorithm', () async {
final _config = await createExtractionConfigFromJson(json: '{"keywords":{"algorithm":"yake","max_keywords":10}}');
final result = await KreuzbergBridge.extractBytesSync(File('pdf/fake_memo.pdf').readAsBytesSync(), 'application/pdf', _config);
expect(result.mimeType.toString().trim(), equals('application/pdf'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(10));
// skipped: field 'keywords' not available on dart result type
// skipped: field 'keywords' not available on dart result type
});
test('Tests page extraction and page marker configuration', () async {
final _config = await createExtractionConfigFromJson(json: '{"pages":{"extract_pages":true,"insert_page_markers":true}}');
final result = await KreuzbergBridge.extractBytesSync(File('pdf/fake_memo.pdf').readAsBytesSync(), 'application/pdf', _config);
expect(result.mimeType.toString().trim(), equals('application/pdf'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(10));
expect(result.content.contains('PAGE'), isTrue);
});
test('Tests quality scoring produces a score value in [0.0, 1.0]', () async {
final result = await KreuzbergBridge.extractBytesSync(File('pdf/fake_memo.pdf').readAsBytesSync(), 'application/pdf', ExtractionConfig(useCache: true, enableQualityProcessing: true, forceOcr: false, disableOcr: false, resultFormat: ResultFormat.unified, outputFormat: OutputFormat.plain(), includeDocumentStructure: false, useLayoutForMarkdown: false, maxArchiveDepth: 3));
expect(result.mimeType.toString().trim(), equals('application/pdf'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(10));
// skipped: field 'quality_score' not available on dart result type
// skipped: field 'quality_score' not available on dart result type
// skipped: field 'quality_score' not available on dart result type
});
test('Tests archive extraction with custom security limits', () async {
final _config = await createExtractionConfigFromJson(json: '{"security_limits":{"max_archive_size":104857600,"max_compression_ratio":50,"max_files_in_archive":100}}');
final result = await KreuzbergBridge.extractBytesSync(File('archives/documents.zip').readAsBytesSync(), 'application/zip', _config);
expect(result.mimeType.contains('application/zip') || result.mimeType.contains('application/x-zip-compressed'), isTrue);
expect(result.content.length, greaterThanOrEqualTo(10));
});
test('Tests tree-sitter configuration round-trip', () async {
final _config = await createExtractionConfigFromJson(json: '{"tree_sitter":{"groups":["web"],"languages":["python","rust"],"process":{"comments":false,"diagnostics":false,"docstrings":false,"exports":true,"imports":true,"structure":true,"symbols":false}}}');
final result = await KreuzbergBridge.extractFileSync('code/hello.py', 'text/x-source-code', _config);
expect(result.mimeType.toString().trim(), equals('text/x-source-code'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(5));
});
test('Tests markdown output format via bytes extraction API', () async {
final _config = await createExtractionConfigFromJson(json: '{"output_format":"markdown"}');
final result = await KreuzbergBridge.extractBytesSync(File('pdf/fake_memo.pdf').readAsBytesSync(), 'application/pdf', _config);
expect(result.mimeType.toString().trim(), equals('application/pdf'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(10));
// skipped: field 'metadata.output_format' not available on dart result type
});
test('Tests Markdown output format', () async {
final _config = await createExtractionConfigFromJson(json: '{"output_format":"markdown"}');
final result = await KreuzbergBridge.extractBytesSync(File('pdf/fake_memo.pdf').readAsBytesSync(), 'application/pdf', _config);
expect(result.mimeType.toString().trim(), equals('application/pdf'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(10));
// skipped: field 'metadata.output_format' not available on dart result type
});
}

70
e2e/dart/test/detection_test.dart generated Normal file
View File

@@ -0,0 +1,70 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'dart:io';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
// E2e tests for category: detection
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
final _testDocs = Platform.environment['FIXTURES_DIR'] ?? '../../test_documents';
final _dir = Directory(_testDocs);
if (_dir.existsSync()) Directory.current = _dir;
});
test('Detect HTML MIME from bytes', () async {
final result = await KreuzbergBridge.detectMimeTypeFromBytes(File('html/html.html').readAsBytesSync());
});
test('Detect PDF MIME type from bytes', () async {
final result = await KreuzbergBridge.detectMimeTypeFromBytes(File('pdf/fake_memo.pdf').readAsBytesSync());
});
test('Detect PNG MIME type from bytes', () async {
final result = await KreuzbergBridge.detectMimeTypeFromBytes(File('images/test_hello_world.png').readAsBytesSync());
});
test('get_extensions unknown MIME', () async {
await expectLater(KreuzbergBridge.getExtensionsForMime('application/x-totally-unknown'), throwsA(anything));
});
}

View File

@@ -0,0 +1,58 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
// E2e tests for category: document_extractor_management
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
});
test('Clear all document extractors and verify list is empty', () async {
final result = await KreuzbergBridge.clearDocumentExtractors();
});
test('List all registered document extractors', () async {
final result = await KreuzbergBridge.listDocumentExtractors();
});
}

View File

@@ -0,0 +1,68 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
import 'dart:convert';
// E2e tests for category: embed_async_pending
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
});
test('embed_texts_async: empty text list', () async {
final _config = await createEmbeddingConfigFromJson(json: '{}');
final result = await KreuzbergBridge.embedTextsAsync(<String>[], _config);
expect(result.length, equals(0));
});
test('embed_texts_async: basic async embedding', () async {
final _config = await createEmbeddingConfigFromJson(json: '{}');
final result = await KreuzbergBridge.embedTextsAsync(<String>['First', 'Second'], _config);
expect(result.length, greaterThanOrEqualTo(2));
});
test('embed_texts_async: preset override', () async {
final _config = await createEmbeddingConfigFromJson(json: '{"model":{"name":"balanced","type":"preset"}}');
final result = await KreuzbergBridge.embedTextsAsync(<String>['Text'], _config);
});
}

56
e2e/dart/test/embed_extra_test.dart generated Normal file
View File

@@ -0,0 +1,56 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
import 'dart:convert';
// E2e tests for category: embed_extra
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
});
test('Batch embed texts', () async {
final _config = await createEmbeddingConfigFromJson(json: '{"model":{"name":"balanced","type":"preset"}}');
final result = await KreuzbergBridge.embedTexts(<String>['Hello', 'World'], _config);
});
}

View File

@@ -0,0 +1,58 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
// E2e tests for category: embedding_backend_management
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
});
test('Clear all embedding backends and verify list is empty', () async {
final result = await KreuzbergBridge.clearEmbeddingBackends();
});
test('List all registered embedding backends', () async {
final result = await KreuzbergBridge.listEmbeddingBackends();
});
}

75
e2e/dart/test/embeddings_test.dart generated Normal file
View File

@@ -0,0 +1,75 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
import 'dart:convert';
// E2e tests for category: embeddings
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
});
test('embed_texts: multilingual preset', () async {
final _config = await createEmbeddingConfigFromJson(json: '{"model":{"name":"multilingual","type":"preset"}}');
final result = await KreuzbergBridge.embedTexts(<String>['Hello world', 'Test'], _config);
expect(result.length, greaterThanOrEqualTo(2));
});
test('get_embedding_preset: known preset', () async {
final result = await KreuzbergBridge.getEmbeddingPreset('balanced');
});
test('get_embedding_preset: nominal case', () async {
final result = await KreuzbergBridge.getEmbeddingPreset('balanced');
});
test('get_embedding_preset: unknown preset fails', () async {
final result = await KreuzbergBridge.getEmbeddingPreset('nonexistent-xyz');
expect(result, anyOf(isNull, isEmpty));
});
test('list_embedding_presets: returns at least one', () async {
final result = await KreuzbergBridge.listEmbeddingPresets();
expect(result, isNotNull);
});
}

74
e2e/dart/test/error_test.dart generated Normal file
View File

@@ -0,0 +1,74 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'dart:io';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
// E2e tests for category: error
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
final _testDocs = Platform.environment['FIXTURES_DIR'] ?? '../../test_documents';
final _dir = Directory(_testDocs);
if (_dir.existsSync()) Directory.current = _dir;
});
test('Graceful handling of empty bytes (should not error)', () async {
final result = await KreuzbergBridge.extractBytesSync(File('text/empty.txt').readAsBytesSync(), 'text/plain');
});
test('Error when extracting with empty MIME type', () async {
await expectLater(KreuzbergBridge.extractBytesSync(File('text/plain.txt').readAsBytesSync(), ''), throwsA(anything));
});
test('extract_bytes force+disable OCR', () async {
await expectLater(KreuzbergBridge.extractBytesSync(File('text/fake_text.txt').readAsBytesSync(), 'text/plain', ExtractionConfig(useCache: true, enableQualityProcessing: true, forceOcr: true, disableOcr: true, resultFormat: ResultFormat.unified, outputFormat: OutputFormat.plain(), includeDocumentStructure: false, useLayoutForMarkdown: false, maxArchiveDepth: 3)), throwsA(anything));
});
test('Error when extracting with invalid MIME type format', () async {
await expectLater(KreuzbergBridge.extractBytesSync(File('text/plain.txt').readAsBytesSync(), 'not-a-mime'), throwsA(anything));
});
test('Error when extracting with unsupported MIME type', () async {
await expectLater(KreuzbergBridge.extractBytesSync(File('text/plain.txt').readAsBytesSync(), 'application/x-nonexistent'), throwsA(anything));
});
}

79
e2e/dart/test/format_specific_test.dart generated Normal file
View File

@@ -0,0 +1,79 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'dart:io';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
// E2e tests for category: format_specific
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
final _testDocs = Platform.environment['FIXTURES_DIR'] ?? '../../test_documents';
final _dir = Directory(_testDocs);
if (_dir.existsSync()) Directory.current = _dir;
});
test('Standalone DOCX extraction using extract_bytes_sync', () async {
final result = await KreuzbergBridge.extractBytesSync(File('docx/fake.docx').readAsBytesSync(), 'application/vnd.openxmlformats-officedocument.wordprocessingml.document');
expect(result.content.length, greaterThanOrEqualTo(20));
});
test('Standalone HWPX extraction using extract_bytes_sync', () async {
final result = await KreuzbergBridge.extractBytesSync(File('hwpx/simple.hwpx').readAsBytesSync(), 'application/haansofthwpx');
expect(result.content.length, greaterThanOrEqualTo(20));
expect(result.content, contains('Hello from HWPX'));
});
test('Standalone PDF text extraction using extract_bytes_sync', () async {
final result = await KreuzbergBridge.extractBytesSync(File('pdf/fake_memo.pdf').readAsBytesSync(), 'application/pdf');
expect(result.content.length, greaterThanOrEqualTo(50));
expect(result.content.contains('Mallori') || result.content.contains('May'), isTrue);
});
test('PPTX presentation extraction using extract_file_sync', () async {
final result = await KreuzbergBridge.extractBytesSync(File('pptx/simple.pptx').readAsBytesSync(), 'application/vnd.openxmlformats-officedocument.presentationml.presentation');
});
test('XLSX spreadsheet extraction using extract_file_sync', () async {
final result = await KreuzbergBridge.extractBytesSync(File('xlsx/stanley_cups.xlsx').readAsBytesSync(), 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
});
}

69
e2e/dart/test/mime_utilities_test.dart generated Normal file
View File

@@ -0,0 +1,69 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'dart:io';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
// E2e tests for category: mime_utilities
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
final _testDocs = Platform.environment['FIXTURES_DIR'] ?? '../../test_documents';
final _dir = Directory(_testDocs);
if (_dir.existsSync()) Directory.current = _dir;
});
test('Detect MIME type from file bytes', () async {
final result = await KreuzbergBridge.detectMimeTypeFromBytes(File('pdf/fake_memo.pdf').readAsBytesSync());
expect(result, contains('pdf'));
});
test('Detect MIME type from PNG image bytes', () async {
final result = await KreuzbergBridge.detectMimeTypeFromBytes(File('images/test_hello_world.png').readAsBytesSync());
expect(result, contains('png'));
});
test('Get file extensions for a MIME type', () async {
final result = await KreuzbergBridge.getExtensionsForMime('application/pdf');
expect(result, contains('pdf'));
});
}

16
e2e/dart/test/minimal_test.dart generated Normal file
View File

@@ -0,0 +1,16 @@
import 'package:test/test.dart';
import 'dart:typed_data';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
void main() {
setUpAll(() async {
await RustLib.init();
});
test('text extraction works', () async {
final content = Uint8List.fromList('Hello world'.codeUnits);
final result = await KreuzbergBridge.extractBytesSync(content, 'text/plain');
print('Text: ${result.content.substring(0, 5)}');
});
}

View File

@@ -0,0 +1,62 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
// E2e tests for category: ocr_backend_management
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
});
test('Clear all OCR backends and verify list is empty', () async {
final result = await KreuzbergBridge.clearOcrBackends();
});
test('List all registered OCR backends', () async {
final result = await KreuzbergBridge.listOcrBackends();
});
test('Unregister nonexistent OCR backend gracefully', () async {
final result = await KreuzbergBridge.unregisterOcrBackend('nonexistent-backend-xyz');
});
}

63
e2e/dart/test/pdf_test.dart generated Normal file
View File

@@ -0,0 +1,63 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'dart:io';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
// E2e tests for category: pdf
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
final _testDocs = Platform.environment['FIXTURES_DIR'] ?? '../../test_documents';
final _dir = Directory(_testDocs);
if (_dir.existsSync()) Directory.current = _dir;
});
test('render_pdf_page_to_png: first page', () async {
final result = await KreuzbergBridge.renderPdfPageToPng(File('pdf/fake_memo.pdf').readAsBytesSync(), 0);
expect(result.length, greaterThanOrEqualTo(100));
});
test('render_pdf_page_to_png: page out of range', () async {
await expectLater(KreuzbergBridge.renderPdfPageToPng(File('pdf/fake_memo.pdf').readAsBytesSync(), 999), throwsA(anything));
});
}

209
e2e/dart/test/plugin_api_test.dart generated Normal file
View File

@@ -0,0 +1,209 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'dart:typed_data';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/kreuzberg.dart' show DocumentExtractor;
import 'package:kreuzberg/kreuzberg.dart' show OcrBackend;
import 'package:kreuzberg/kreuzberg.dart' show PostProcessor;
import 'package:kreuzberg/kreuzberg.dart' show Renderer;
import 'package:kreuzberg/kreuzberg.dart' show Validator;
import 'package:kreuzberg/kreuzberg.dart' show EmbeddingBackend;
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
// E2e tests for category: plugin_api
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
class TestStubRegisterDocumentExtractorTraitBridge extends DocumentExtractor {
String get name => 'register_document_extractor_trait_bridge';
Future<InternalDocumentBridge> extractBytes(Uint8List content, String mimeType, ExtractionConfig config) async => throw UnimplementedError();
Future<InternalDocumentBridge> extractFile(String path, String mimeType, ExtractionConfig config) async => throw UnimplementedError();
Future<List<String>> supportedMimeTypes() async => [];
Future<int> priority() async => 1;
Future<bool> canHandle(String path, String mimeType) async => false;
}
final _TestStubRegisterDocumentExtractorTraitBridge_instance = TestStubRegisterDocumentExtractorTraitBridge();
Future<DocumentExtractorDartImpl> _createTestStubRegisterDocumentExtractorTraitBridgeWrapper() async => await createDocumentExtractorDartImpl(
pluginName: 'register_document_extractor_trait_bridge',
pluginVersion: '0.0.1',
extractBytes: (Uint8List content, String mimeType, ExtractionConfig config) => _TestStubRegisterDocumentExtractorTraitBridge_instance.extractBytes(content, mimeType, config),
extractFile: (String path, String mimeType, ExtractionConfig config) => _TestStubRegisterDocumentExtractorTraitBridge_instance.extractFile(path, mimeType, config),
supportedMimeTypes: () => _TestStubRegisterDocumentExtractorTraitBridge_instance.supportedMimeTypes(),
priority: () => _TestStubRegisterDocumentExtractorTraitBridge_instance.priority(),
canHandle: (String path, String mimeType) => _TestStubRegisterDocumentExtractorTraitBridge_instance.canHandle(path, mimeType)
);
class TestStubRegisterEmbeddingBackendTraitBridge extends EmbeddingBackend {
String get name => 'register_embedding_backend_trait_bridge';
Future<int> dimensions() async => 1;
Future<List<Float64List>> embed(List<String> texts) async => [];
}
final _TestStubRegisterEmbeddingBackendTraitBridge_instance = TestStubRegisterEmbeddingBackendTraitBridge();
Future<EmbeddingBackendDartImpl> _createTestStubRegisterEmbeddingBackendTraitBridgeWrapper() async => await createEmbeddingBackendDartImpl(
pluginName: 'register_embedding_backend_trait_bridge',
pluginVersion: '0.0.1',
dimensions: () => _TestStubRegisterEmbeddingBackendTraitBridge_instance.dimensions(),
embed: (List<String> texts) => _TestStubRegisterEmbeddingBackendTraitBridge_instance.embed(texts)
);
class TestStubRegisterOcrBackendTraitBridge extends OcrBackend {
String get name => 'register_ocr_backend_trait_bridge';
Future<ExtractionResult> processImage(Uint8List imageBytes, OcrConfig config) async => throw UnimplementedError();
Future<ExtractionResult> processImageFile(String path, OcrConfig config) async => throw UnimplementedError();
Future<bool> supportsLanguage(String lang) async => false;
Future<OcrBackendType> backendType() async => OcrBackendType.tesseract;
Future<List<String>> supportedLanguages() async => [];
Future<bool> supportsTableDetection() async => false;
Future<bool> supportsDocumentProcessing() async => false;
Future<ExtractionResult> processDocument(String path, OcrConfig config) async => throw UnimplementedError();
}
final _TestStubRegisterOcrBackendTraitBridge_instance = TestStubRegisterOcrBackendTraitBridge();
Future<OcrBackendDartImpl> _createTestStubRegisterOcrBackendTraitBridgeWrapper() async => await createOcrBackendDartImpl(
pluginName: 'register_ocr_backend_trait_bridge',
pluginVersion: '0.0.1',
processImage: (Uint8List imageBytes, OcrConfig config) => _TestStubRegisterOcrBackendTraitBridge_instance.processImage(imageBytes, config),
processImageFile: (String path, OcrConfig config) => _TestStubRegisterOcrBackendTraitBridge_instance.processImageFile(path, config),
supportsLanguage: (String lang) => _TestStubRegisterOcrBackendTraitBridge_instance.supportsLanguage(lang),
backendType: () => _TestStubRegisterOcrBackendTraitBridge_instance.backendType(),
supportedLanguages: () => _TestStubRegisterOcrBackendTraitBridge_instance.supportedLanguages(),
supportsTableDetection: () => _TestStubRegisterOcrBackendTraitBridge_instance.supportsTableDetection(),
supportsDocumentProcessing: () => _TestStubRegisterOcrBackendTraitBridge_instance.supportsDocumentProcessing(),
processDocument: (String path, OcrConfig config) => _TestStubRegisterOcrBackendTraitBridge_instance.processDocument(path, config)
);
class TestStubRegisterPostProcessorTraitBridge extends PostProcessor {
String get name => 'register_post_processor_trait_bridge';
Future<void> process(ExtractionResult result, ExtractionConfig config) async => null;
Future<ProcessingStage> processingStage() async => ProcessingStage.early;
Future<bool> shouldProcess(ExtractionResult result, ExtractionConfig config) async => false;
Future<int> estimatedDurationMs(ExtractionResult result) async => 1;
Future<int> priority() async => 1;
}
final _TestStubRegisterPostProcessorTraitBridge_instance = TestStubRegisterPostProcessorTraitBridge();
Future<PostProcessorDartImpl> _createTestStubRegisterPostProcessorTraitBridgeWrapper() async => await createPostProcessorDartImpl(
pluginName: 'register_post_processor_trait_bridge',
pluginVersion: '0.0.1',
process: (ExtractionResult result, ExtractionConfig config) => _TestStubRegisterPostProcessorTraitBridge_instance.process(result, config),
processingStage: () => _TestStubRegisterPostProcessorTraitBridge_instance.processingStage(),
shouldProcess: (ExtractionResult result, ExtractionConfig config) => _TestStubRegisterPostProcessorTraitBridge_instance.shouldProcess(result, config),
estimatedDurationMs: (ExtractionResult result) => _TestStubRegisterPostProcessorTraitBridge_instance.estimatedDurationMs(result),
priority: () => _TestStubRegisterPostProcessorTraitBridge_instance.priority()
);
class TestStubRegisterRendererTraitBridge extends Renderer {
String get name => 'register_renderer_trait_bridge';
Future<String> render(InternalDocumentBridge doc) async => '';
}
final _TestStubRegisterRendererTraitBridge_instance = TestStubRegisterRendererTraitBridge();
Future<RendererDartImpl> _createTestStubRegisterRendererTraitBridgeWrapper() async => await createRendererDartImpl(
pluginName: 'register_renderer_trait_bridge',
pluginVersion: '0.0.1',
render: (InternalDocumentBridge doc) => _TestStubRegisterRendererTraitBridge_instance.render(doc)
);
class TestStubRegisterValidatorTraitBridge extends Validator {
String get name => 'register_validator_trait_bridge';
Future<void> validate(ExtractionResult result, ExtractionConfig config) async => null;
Future<bool> shouldValidate(ExtractionResult result, ExtractionConfig config) async => false;
Future<int> priority() async => 1;
}
final _TestStubRegisterValidatorTraitBridge_instance = TestStubRegisterValidatorTraitBridge();
Future<ValidatorDartImpl> _createTestStubRegisterValidatorTraitBridgeWrapper() async => await createValidatorDartImpl(
pluginName: 'register_validator_trait_bridge',
pluginVersion: '0.0.1',
validate: (ExtractionResult result, ExtractionConfig config) => _TestStubRegisterValidatorTraitBridge_instance.validate(result, config),
shouldValidate: (ExtractionResult result, ExtractionConfig config) => _TestStubRegisterValidatorTraitBridge_instance.shouldValidate(result, config),
priority: () => _TestStubRegisterValidatorTraitBridge_instance.priority()
);
void main() {
setUpAll(() async {
await RustLib.init();
});
test('register_document_extractor: trait bridge', () async {
final result = await KreuzbergBridge.registerDocumentExtractor(await _createTestStubRegisterDocumentExtractorTraitBridgeWrapper());
});
test('register_embedding_backend: trait bridge', () async {
final result = await KreuzbergBridge.registerEmbeddingBackend(await _createTestStubRegisterEmbeddingBackendTraitBridgeWrapper());
});
test('register_ocr_backend: trait bridge', () async {
final result = await KreuzbergBridge.registerOcrBackend(await _createTestStubRegisterOcrBackendTraitBridgeWrapper());
});
test('register_post_processor: trait bridge', () async {
final result = await KreuzbergBridge.registerPostProcessor(await _createTestStubRegisterPostProcessorTraitBridgeWrapper());
});
test('register_renderer: trait bridge', () async {
final result = await KreuzbergBridge.registerRenderer(await _createTestStubRegisterRendererTraitBridgeWrapper());
});
test('register_validator: trait bridge', () async {
final result = await KreuzbergBridge.registerValidator(await _createTestStubRegisterValidatorTraitBridgeWrapper());
});
test('unregister_document_extractor', () async {
final result = await KreuzbergBridge.unregisterDocumentExtractor('test-extractor');
});
test('unregister_embedding_backend', () async {
final result = await KreuzbergBridge.unregisterEmbeddingBackend('test-embedding-backend');
});
test('unregister_post_processor', () async {
final result = await KreuzbergBridge.unregisterPostProcessor('test-processor');
});
test('unregister_renderer', () async {
final result = await KreuzbergBridge.unregisterRenderer('test-renderer');
});
test('unregister_validator', () async {
final result = await KreuzbergBridge.unregisterValidator('test-validator');
});
}

View File

@@ -0,0 +1,58 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
// E2e tests for category: post_processor_management
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
});
test('Clear all post-processors and verify list is empty', () async {
final result = await KreuzbergBridge.clearPostProcessors();
});
test('List all registered post-processors', () async {
final result = await KreuzbergBridge.listPostProcessors();
});
}

View File

@@ -0,0 +1,62 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
// E2e tests for category: registry_operations
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
});
test('Get file extensions for DOCX MIME type', () async {
final result = await KreuzbergBridge.getExtensionsForMime('application/vnd.openxmlformats-officedocument.wordprocessingml.document');
});
test('Get file extensions for HTML MIME type', () async {
final result = await KreuzbergBridge.getExtensionsForMime('text/html');
});
test('Get file extensions for PDF MIME type', () async {
final result = await KreuzbergBridge.getExtensionsForMime('application/pdf');
});
}

74
e2e/dart/test/registry_test.dart generated Normal file
View File

@@ -0,0 +1,74 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
// E2e tests for category: registry
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
});
test('List document extractors', () async {
final result = await KreuzbergBridge.listDocumentExtractors();
});
test('List embedding backends', () async {
final result = await KreuzbergBridge.listEmbeddingBackends();
});
test('List OCR backends', () async {
final result = await KreuzbergBridge.listOcrBackends();
});
test('List post-processors', () async {
final result = await KreuzbergBridge.listPostProcessors();
});
test('List renderers', () async {
final result = await KreuzbergBridge.listRenderers();
});
test('List validators', () async {
final result = await KreuzbergBridge.listValidators();
});
}

View File

@@ -0,0 +1,58 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
// E2e tests for category: renderer_management
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
});
test('Clear all renderers and verify list is empty', () async {
final result = await KreuzbergBridge.clearRenderers();
});
test('List all registered renderers', () async {
final result = await KreuzbergBridge.listRenderers();
});
}

117
e2e/dart/test/smoke_test.dart generated Normal file
View File

@@ -0,0 +1,117 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'dart:io';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
// E2e tests for category: smoke
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
final _testDocs = Platform.environment['FIXTURES_DIR'] ?? '../../test_documents';
final _dir = Directory(_testDocs);
if (_dir.existsSync()) Directory.current = _dir;
});
test('OCR: PNG image extraction with OCR enabled. In WASM this exercises the Uint8Array bridge parameter and Promise await in the generated OcrBackend bridge.', () async {
final result = await KreuzbergBridge.extractBytes(File('images/test_hello_world.png').readAsBytesSync(), 'image/png');
expect(result.mimeType.toString().trim(), equals('image/png'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(1));
expect(result.content.contains('Hello') || result.content.contains('World') || result.content.contains('hello') || result.content.contains('world'), isTrue);
});
test('Smoke test: DOCX with formatted text', () async {
final result = await KreuzbergBridge.extractBytes(File('docx/fake.docx').readAsBytesSync(), 'application/vnd.openxmlformats-officedocument.wordprocessingml.document');
expect(result.mimeType.toString().trim(), equals('application/vnd.openxmlformats-officedocument.wordprocessingml.document'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(20));
expect(result.content.contains('Lorem') || result.content.contains('ipsum') || result.content.contains('document') || result.content.contains('text'), isTrue);
});
test('Smoke test: HTML table extraction', () async {
final result = await KreuzbergBridge.extractBytes(File('html/simple_table.html').readAsBytesSync(), 'text/html');
expect(result.mimeType.toString().trim(), equals('text/html'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(10));
expect(result.content.contains('Sample Data Table') || result.content.contains('Laptop') || result.content.contains('Electronics') || result.content.contains('Product'), isTrue);
});
test('Smoke test: PNG image (without OCR, metadata only)', () async {
final result = await KreuzbergBridge.extractBytes(File('images/sample.png').readAsBytesSync(), 'image/png', ExtractionConfig(useCache: true, enableQualityProcessing: true, forceOcr: false, disableOcr: true, resultFormat: ResultFormat.unified, outputFormat: OutputFormat.plain(), includeDocumentStructure: false, useLayoutForMarkdown: false, maxArchiveDepth: 3));
expect(result.mimeType.toString().trim(), equals('image/png'.toString().trim()));
});
test('Smoke test: JSON file extraction', () async {
final result = await KreuzbergBridge.extractBytes(File('json/simple.json').readAsBytesSync(), 'application/json');
expect(result.mimeType.toString().trim(), equals('application/json'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(5));
});
test('Smoke test: PDF with simple text extraction', () async {
final result = await KreuzbergBridge.extractBytes(File('pdf/fake_memo.pdf').readAsBytesSync(), 'application/pdf');
expect(result.mimeType.toString().trim(), equals('application/pdf'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(50));
expect(result.content.contains('May 5, 2023') || result.content.contains('To Whom it May Concern'), isTrue);
});
test('Smoke test: Plain text file', () async {
final result = await KreuzbergBridge.extractBytes(File('text/report.txt').readAsBytesSync(), 'text/plain');
expect(result.mimeType.toString().trim(), equals('text/plain'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(5));
});
test('Smoke test: XLSX with basic spreadsheet data including tables', () async {
final result = await KreuzbergBridge.extractBytes(File('xlsx/stanley_cups.xlsx').readAsBytesSync(), 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
expect(result.mimeType.toString().trim(), equals('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'.toString().trim()));
expect(result.content.length, greaterThanOrEqualTo(100));
expect(result.content, contains('Team'));
expect(result.content, contains('Location'));
expect(result.content, contains('Stanley Cups'));
expect(result.content, contains('Blues'));
expect(result.content, contains('Flyers'));
expect(result.content, contains('Maple Leafs'));
expect(result.content, contains('STL'));
expect(result.content, contains('PHI'));
expect(result.content, contains('TOR'));
// skipped: field 'tables' not available on dart result type
// skipped: field 'metadata.format.excel.sheet_count' not available on dart result type
// skipped: field 'metadata.format.excel.sheet_names' not available on dart result type
});
}

View File

@@ -0,0 +1,58 @@
// This file is auto-generated by alef — DO NOT EDIT.
// alef:hash:4e15143f4af1ae8bafbdb1506ef057da924484c66a19483966333558ad437e75
// To regenerate: alef generate
// To verify freshness: alef verify --exit-code
// Issues & docs: https://github.com/kreuzberg-dev/alef
// ignore_for_file: unused_local_variable
import 'package:test/test.dart';
import 'package:kreuzberg/kreuzberg.dart';
import 'package:kreuzberg/src/kreuzberg_bridge_generated/frb_generated.dart' show RustLib;
// E2e tests for category: validator_management
String _alefE2eText(Object? value) {
if (value == null) return '';
// Check if it's an enum by examining its toString representation.
final str = value.toString();
if (str.contains('.')) {
// Enum.toString() returns 'EnumName.variantName'. Extract the variant name.
final parts = str.split('.');
if (parts.length == 2) {
final variantName = parts[1];
// Convert camelCase variant names to snake_case for serde compatibility.
// E.g. 'toolCalls' -> 'tool_calls', 'stop' -> 'stop'.
return _camelToSnake(variantName);
}
}
return str;
}
String _camelToSnake(String camel) {
final buffer = StringBuffer();
for (int i = 0; i < camel.length; i++) {
final char = camel[i];
if (char.contains(RegExp(r'[A-Z]'))) {
if (i > 0) buffer.write('_');
buffer.write(char.toLowerCase());
} else {
buffer.write(char);
}
}
return buffer.toString();
}
void main() {
setUpAll(() async {
await RustLib.init();
});
test('Clear all validators and verify list is empty', () async {
final result = await KreuzbergBridge.clearValidators();
});
test('List all registered validators', () async {
final result = await KreuzbergBridge.listValidators();
});
}