feat(core): Implement Protocol V2 with enhanced settings and lifecycle hooks
This commit is contained in:
@@ -125,4 +125,94 @@ The protocol v2 implementation is contained in a separate `ts_tapbundle_protocol
|
||||
|
||||
This architectural decision ensures the protocol can be used in any JavaScript environment without modification and maintains proper build dependencies.
|
||||
|
||||
See `readme.protocol.md` for the full specification and `ts_tapbundle_protocol/` for the implementation.
|
||||
See `readme.protocol.md` for the full specification and `ts_tapbundle_protocol/` for the implementation.
|
||||
|
||||
## Protocol V2 Implementation Status
|
||||
|
||||
The Protocol V2 has been implemented to fix issues with TAP protocol parsing when test descriptions contain special characters like `#`, `###SNAPSHOT###`, or protocol markers like `⟦TSTEST:ERROR⟧`.
|
||||
|
||||
### Implementation Details:
|
||||
|
||||
1. **Protocol Components**:
|
||||
- `ProtocolEmitter` - Generates protocol v2 messages (used by tapbundle)
|
||||
- `ProtocolParser` - Parses protocol v2 messages (used by tstest)
|
||||
- Uses Unicode markers `⟦TSTEST:` and `⟧` to avoid conflicts with test content
|
||||
|
||||
2. **Current Status**:
|
||||
- ✅ Basic protocol emission and parsing works
|
||||
- ✅ Handles test descriptions with special characters correctly
|
||||
- ✅ Supports metadata for timing, tags, errors
|
||||
- ⚠️ Protocol messages sometimes appear in console output (parsing not catching all cases)
|
||||
|
||||
3. **Key Findings**:
|
||||
- `tap.skip.test()` doesn't create actual test objects, just logs and increments counter
|
||||
- `tap.todo()` method is not implemented (no `addTodo` method in Tap class)
|
||||
- Protocol parser's `isBlockStart` was fixed to only match exact block markers, not partial matches in test descriptions
|
||||
|
||||
4. **Import Paths**:
|
||||
- tstest imports from: `import { ProtocolParser } from '../dist_ts_tapbundle_protocol/index.js';`
|
||||
- tapbundle imports from: `import { ProtocolEmitter } from '../dist_ts_tapbundle_protocol/index.js';`
|
||||
|
||||
## Test Configuration System (Phase 2)
|
||||
|
||||
The Test Configuration System has been implemented to provide global settings and lifecycle hooks for tests.
|
||||
|
||||
### Key Features:
|
||||
|
||||
1. **00init.ts Discovery**:
|
||||
- Automatically detects `00init.ts` files in the same directory as test files
|
||||
- Creates a temporary loader file that imports both `00init.ts` and the test file
|
||||
- Loader files are cleaned up automatically after test execution
|
||||
|
||||
2. **Settings Inheritance**:
|
||||
- Global settings from `00init.ts` → File-level settings → Test-level settings
|
||||
- Settings include: timeout, retries, retryDelay, bail, concurrency
|
||||
- Lifecycle hooks: beforeAll, afterAll, beforeEach, afterEach
|
||||
|
||||
3. **Implementation Details**:
|
||||
- `SettingsManager` class handles settings inheritance and merging
|
||||
- `tap.settings()` API allows configuration at any level
|
||||
- Lifecycle hooks are integrated into test execution flow
|
||||
|
||||
### Important Development Notes:
|
||||
|
||||
1. **Local Development**: When developing tstest itself, use `node cli.js` instead of globally installed `tstest` to test changes
|
||||
|
||||
2. **Console Output Buffering**: Console output from tests is buffered and only displayed for failing tests. TAP-compliant comments (lines starting with `#`) are always shown.
|
||||
|
||||
3. **TypeScript Warnings**: Fixed async/await warnings in `movePreviousLogFiles()` by using sync versions of file operations
|
||||
|
||||
## Enhanced Communication Features (Phase 3)
|
||||
|
||||
The Enhanced Communication system has been implemented to provide rich, real-time feedback during test execution.
|
||||
|
||||
### Key Features:
|
||||
|
||||
1. **Event-Based Test Lifecycle Reporting**:
|
||||
- `test:queued` - Test is ready to run
|
||||
- `test:started` - Test execution begins
|
||||
- `test:completed` - Test finishes (with pass/fail status)
|
||||
- `suite:started` - Test suite/describe block begins
|
||||
- `suite:completed` - Test suite/describe block ends
|
||||
- `hook:started` - Lifecycle hook (beforeEach/afterEach) begins
|
||||
- `hook:completed` - Lifecycle hook finishes
|
||||
- `assertion:failed` - Assertion failure with detailed information
|
||||
|
||||
2. **Visual Diff Output for Assertion Failures**:
|
||||
- **String Diffs**: Character-by-character comparison with colored output
|
||||
- **Object/Array Diffs**: Deep property comparison showing added/removed/changed properties
|
||||
- **Primitive Diffs**: Clear display of expected vs actual values
|
||||
- **Colorized Output**: Green for expected, red for actual, yellow for differences
|
||||
- **Smart Formatting**: Multi-line strings and complex objects are formatted for readability
|
||||
|
||||
3. **Real-Time Test Progress API**:
|
||||
- Tests emit progress events as they execute
|
||||
- tstest parser processes events and updates display in real-time
|
||||
- Structured event format carries rich metadata (timing, errors, diffs)
|
||||
- Seamless integration with existing TAP protocol via Protocol V2
|
||||
|
||||
### Implementation Details:
|
||||
- Events are transmitted via Protocol V2's `EVENT` block type
|
||||
- Event data is JSON-encoded within protocol markers
|
||||
- Parser handles events asynchronously for real-time updates
|
||||
- Visual diffs are generated using custom diff algorithms for each data type
|
Reference in New Issue
Block a user