Files
jaidaken f09734b0ee
Some checks failed
Python Linting / Run Ruff (push) Has been cancelled
Python Linting / Run Pylint (push) Has been cancelled
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.10, [self-hosted Linux], stable) (push) Has been cancelled
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.11, [self-hosted Linux], stable) (push) Has been cancelled
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.12, [self-hosted Linux], stable) (push) Has been cancelled
Full Comfy CI Workflow Runs / test-unix-nightly (12.1, , linux, 3.11, [self-hosted Linux], nightly) (push) Has been cancelled
Execution Tests / test (macos-latest) (push) Has been cancelled
Execution Tests / test (ubuntu-latest) (push) Has been cancelled
Execution Tests / test (windows-latest) (push) Has been cancelled
Test server launches without errors / test (push) Has been cancelled
Unit Tests / test (macos-latest) (push) Has been cancelled
Unit Tests / test (ubuntu-latest) (push) Has been cancelled
Unit Tests / test (windows-2022) (push) Has been cancelled
Add custom nodes, Civitai loras (LFS), and vast.ai setup script
Includes 30 custom nodes committed directly, 7 Civitai-exclusive
loras stored via Git LFS, and a setup script that installs all
dependencies and downloads HuggingFace-hosted models on vast.ai.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 00:56:42 +00:00

962 lines
21 KiB
Markdown

# Wildcard System - Complete Test Suite
Comprehensive testing guide for the ComfyUI Impact Pack wildcard system.
---
## 📋 Quick Links
- **[Quick Start](#quick-start)** - Run tests in 5 minutes
- **[Test Categories](#test-categories)** - All test types
- **[Test Execution](#test-execution)** - How to run each test
- **[Troubleshooting](#troubleshooting)** - Common issues
---
## Overview
### Test Suite Structure
```
tests/
├── wildcards/ # Wildcard system tests
│ ├── Unit Tests (Python)
│ │ ├── test_wildcard_lazy_loading.py # LazyWildcardLoader class
│ │ ├── test_progressive_loading.py # Progressive loading
│ │ ├── test_wildcard_final.py # Final validation
│ │ └── test_lazy_load_verification.py # Lazy load verification
│ │
│ ├── Integration Tests (Shell + API)
│ │ ├── test_progressive_ondemand.sh # ⭐ Progressive loading (NEW)
│ │ ├── test_lazy_load_api.sh # Lazy loading consistency
│ │ ├── test_sequential_loading.sh # Transitive wildcards
│ │ ├── test_versatile_prompts.sh # Feature tests
│ │ ├── test_wildcard_consistency.sh # Consistency validation
│ │ └── test_wildcard_features.sh # Core features
│ │
│ ├── Utility Scripts
│ │ ├── find_transitive_wildcards.sh # Find transitive chains
│ │ ├── find_deep_transitive.py # Deep transitive analysis
│ │ ├── verify_ondemand_mode.sh # Verify on-demand activation
│ │ └── run_quick_test.sh # Quick validation
│ │
│ └── README.md (this file)
└── workflows/ # Workflow test files
├── advanced-sampler.json
├── detailer-pipe-test.json
└── ...
```
### Test Coverage
- **11 test files** (4 Python, 7 Shell)
- **100+ test scenarios**
- **~95% feature coverage**
- **~15 minutes** total execution time
---
## Quick Start
### Run All Tests
```bash
cd /path/to/ComfyUI/custom_nodes/comfyui-impact-pack/tests/wildcards
# Run all shell tests
for test in test_*.sh; do
echo "Running: $test"
bash "$test"
done
```
### Run Specific Test
```bash
cd /path/to/ComfyUI/custom_nodes/comfyui-impact-pack/tests/wildcards
# Progressive loading (NEW)
bash test_progressive_ondemand.sh
# Lazy loading
bash test_lazy_load_api.sh
# Sequential/transitive
bash test_sequential_loading.sh
# Versatile prompts
bash test_versatile_prompts.sh
```
---
## Test Categories
### 1. Progressive On-Demand Loading Tests ⭐ NEW
**Purpose**: Verify wildcards are loaded progressively as accessed.
**Test Files**:
- `test_progressive_ondemand.sh` (Shell, ~2 min)
- `test_progressive_loading.py` (Python unit test)
#### What's Tested
**Early Termination Size Calculation**:
```python
# Problem: 10GB scan takes 10-30 minutes
# Solution: Stop at cache limit
calculate_directory_size(path, limit=50MB) # < 1 second
```
**YAML Pre-loading + TXT On-Demand**:
```python
# Phase 1 (Startup): Pre-load ALL YAML files
# Reason: Keys are inside file content, not file path
load_yaml_files_only() # colors.yaml → colors, colors/warm, colors/cold
# Phase 2 (Runtime): Load TXT files on-demand
# File path = key (e.g., "flower.txt" → "__flower__")
# No metadata scan for TXT files
```
**Progressive Loading**:
```
Initial: /list/loaded → YAML keys only (e.g., colors, colors/warm, colors/cold)
After __flower__: /list/loaded → +1 TXT wildcard
After __dragon__: /list/loaded → +2-3 (TXT transitive)
```
**⚠️ YAML Limitation**:
YAML wildcards are excluded from on-demand mode because wildcard keys exist
inside the file content. To discover `__colors/warm__`, we must parse `colors.yaml`.
Solution: Convert large YAML collections to TXT file structure for true on-demand.
#### New API Endpoint
**`GET /impact/wildcards/list/loaded`**:
```json
{
"data": ["__colors__", "__colors/warm__", "__colors/cold__", "__samples/flower__"],
"on_demand_mode": true,
"total_available": 0
}
```
Note: `total_available` is 0 in on-demand mode (TXT files not pre-scanned)
**Progressive Example**:
```bash
# Initial state (YAML pre-loaded)
curl /impact/wildcards/list/loaded
{"data": ["__colors__", "__colors/warm__", "__colors/cold__"], "total_available": 0}
# Access first wildcard
curl -X POST /impact/wildcards -d '{"text": "__flower__", "seed": 42}'
# Check again (TXT wildcard added)
curl /impact/wildcards/list/loaded
{"data": ["__colors__", "__colors/warm__", "__colors/cold__", "__samples/flower__"], "total_available": 0}
```
#### Performance Improvements
**Large Dataset (10GB, 100K files)**:
| Metric | Before | After |
|--------|--------|-------|
| **Startup** | 20-60 min | **< 1 min** |
| **Memory** | 5-10 GB | **< 100MB** |
| **Size calc** | 10-30 min | **< 1 sec** |
#### Run Test
```bash
bash test_progressive_ondemand.sh
```
**Expected Output**:
```
Step 1: Initial state
Loaded wildcards: 0
Step 2: Access __samples/flower__
Loaded wildcards: 1
✓ PASS: Wildcard count increased
Step 3: Access __dragon__
Loaded wildcards: 3
✓ PASS: Wildcard count increased progressively
🎉 ALL TESTS PASSED
```
---
### 2. Lazy Loading Tests
**Purpose**: Verify on-demand loading produces identical results to full cache mode.
**Test Files**:
- `test_lazy_load_api.sh` (Shell, ~3 min)
- `test_wildcard_lazy_loading.py` (Python unit test)
- `test_lazy_load_verification.py` (Python verification)
#### What's Tested
**LazyWildcardLoader Class**:
- Loads data only on first access
- Acts as list-like proxy
- Thread-safe with locking
**Mode Detection**:
- Automatic based on total size vs cache limit
- Full cache: < 50MB (default)
- On-demand: ≥ 50MB
**Consistency**:
- Full cache results == On-demand results
- Same seeds produce same outputs
- All wildcard features work identically
#### Test Scenarios
**test_lazy_load_api.sh** runs both modes and compares:
1. **Wildcard list** (before access)
2. **Simple wildcard**: `__samples/flower__`
3. **Depth 3 transitive**: `__adnd__ creature`
4. **YAML wildcard**: `__colors__`
5. **Wildcard list** (after access)
**All results must match exactly**.
#### Run Test
```bash
bash test_lazy_load_api.sh
```
**Expected Output**:
```
Testing: full_cache (limit: 100MB, port: 8190)
✓ Server started
Test 1: Get wildcard list
Total wildcards: 1000
Testing: on_demand (limit: 1MB, port: 8191)
✓ Server started
Test 1: Get wildcard list
Total wildcards: 1000
COMPARISON RESULTS
Test: Simple Wildcard
✓ Results MATCH
🎉 ALL TESTS PASSED
On-demand loading produces IDENTICAL results!
```
---
### 3. Sequential/Transitive Loading Tests
**Purpose**: Verify transitive wildcards expand correctly across multiple stages.
**Test Files**:
- `test_sequential_loading.sh` (Shell, ~5 min)
- `find_transitive_wildcards.sh` (Utility)
#### What's Tested
**Transitive Expansion**:
```
Depth 1: __samples/flower__ → rose
Depth 2: __dragon__ → __dragon/warrior__ → content
Depth 3: __adnd__ → __dragon__ → __dragon_spirit__ → content
```
**Maximum Depth**: 3 levels verified (system supports up to 100)
#### Test Categories
**17 tests across 5 categories**:
1. **Depth Verification** (4 tests)
- Depth 1: Direct wildcard
- Depth 2: One level transitive
- Depth 3: Two levels + suffix
- Depth 3: Maximum chain
2. **Mixed Transitive** (3 tests)
- Dynamic selection of transitive
- Multiple transitive in one prompt
- Nested transitive in dynamic
3. **Complex Scenarios** (3 tests)
- Weighted selection with transitive
- Multi-select with transitive
- Quantified transitive
4. **Edge Cases** (4 tests)
- Compound grammar
- Multiple wildcards, different depths
- YAML wildcards (no transitive)
- Transitive + YAML combination
5. **On-Demand Mode** (3 tests)
- Depth 3 in on-demand
- Complex scenario in on-demand
- Multiple transitive in on-demand
#### Example: Depth 3 Chain
**Files**:
```
adnd.txt:
__dragon__
dragon.txt:
__dragon_spirit__
dragon_spirit.txt:
Shrewd Hatchling
Ancient Dragon
```
**Usage**:
```
__adnd__ creature
→ __dragon__ creature
→ __dragon_spirit__ creature
→ "Shrewd Hatchling creature"
```
#### Run Test
```bash
bash test_sequential_loading.sh
```
**Expected Output**:
```
=== Test 01: Depth 1 - Direct wildcard ===
Raw prompt: __samples/flower__
✓ All wildcards fully expanded
Final Output: rose
Status: ✅ SUCCESS
=== Test 04: Depth 3 - Maximum transitive chain ===
Raw prompt: __adnd__ creature
✓ All wildcards fully expanded
Final Output: Shrewd Hatchling creature
Status: ✅ SUCCESS
```
---
### 4. Versatile Prompts Tests
**Purpose**: Test all wildcard features and syntax variations.
**Test Files**:
- `test_versatile_prompts.sh` (Shell, ~2 min)
- `test_wildcard_features.sh` (Shell)
- `test_wildcard_consistency.sh` (Shell)
#### What's Tested
**30 prompts across 10 categories**:
1. **Simple Wildcards** (3 tests)
- Basic substitution
- Case insensitive (uppercase)
- Case insensitive (mixed)
2. **Dynamic Prompts** (3 tests)
- Simple: `{red|green|blue} apple`
- Nested: `{a|{d|e|f}|c}`
- Complex nested: `{blue apple|red {cherry|berry}}`
3. **Selection Weights** (2 tests)
- Weighted: `{5::red|4::green|7::blue} car`
- Multiple weighted: `{10::beautiful|5::stunning} {3::sunset|2::sunrise}`
4. **Compound Grammar** (3 tests)
- Wildcard + dynamic: `{pencil|apple|__flower__}`
- Complex compound: `1{girl|boy} {sitting|standing} with {__object__|item}`
- Nested compound: `{big|small} {red {apple|cherry}|blue __flower__}`
5. **Multi-Select** (4 tests)
- Fixed count: `{2$$, $$opt1|opt2|opt3|opt4}`
- Range: `{2-4$$, $$opt1|opt2|opt3|opt4|opt5}`
- With separator: `{3$$; $$a|b|c|d|e}`
- Short form: `{-3$$, $$opt1|opt2|opt3|opt4}`
6. **Quantifiers** (2 tests)
- Basic: `3#__wildcard__`
- With multi-select: `{2$$, $$5#__colors__}`
7. **Wildcard Fallback** (2 tests)
- Auto-expand: `__flower__``__*/flower__`
- Wildcard patterns: `__samples/*__`
8. **YAML Wildcards** (3 tests)
- Simple YAML: `__colors__`
- Nested YAML: `__colors/warm__`
- Multiple YAML: `__colors__ and __animals__`
9. **Transitive Wildcards** (4 tests)
- Depth 2: `__dragon__`
- Depth 3: `__adnd__`
- Mixed depth: `__flower__ and __dragon__`
- Dynamic transitive: `{__dragon__|__adnd__}`
10. **Real-World Scenarios** (4 tests)
- Portrait prompt
- Landscape prompt
- Fantasy prompt
- Abstract art prompt
#### Example Tests
**Test 04: Simple Dynamic Prompt**:
```
Raw: {red|green|blue} apple
Seed: 100
Result: "red apple" (deterministic)
```
**Test 09: Wildcard + Dynamic**:
```
Raw: 1girl holding {blue pencil|red apple|colorful __samples/flower__}
Seed: 100
Result: "1girl holding colorful chrysanthemum"
```
**Test 18: Multi-Select Range**:
```
Raw: {2-4$$, $$happy|sad|angry|excited|calm}
Seed: 100
Result: "happy, sad, angry" (2-4 emotions selected)
```
#### Run Test
```bash
bash test_versatile_prompts.sh
```
**Expected Output**:
```
========================================
Test 01: Basic Wildcard
========================================
Raw: __samples/flower__
Result: chrysanthemum
Status: ✅ PASS
========================================
Test 04: Simple Dynamic Prompt
========================================
Raw: {red|green|blue} apple
Result: red apple
Status: ✅ PASS
Total: 30 tests
Passed: 30
Failed: 0
```
---
## Test Execution
### Prerequisites
**Required**:
- ComfyUI installed
- Impact Pack installed
- Python 3.8+
- Bash shell
- curl (for API tests)
**Optional**:
- jq (for JSON parsing)
- git (for version control)
### Environment Setup
**1. Configure Impact Pack**:
```bash
cd /path/to/ComfyUI/custom_nodes/comfyui-impact-pack
# Create or edit config
cat > impact-pack.ini << EOF
[default]
dependency_version = 24
wildcard_cache_limit_mb = 50
custom_wildcards = $(pwd)/custom_wildcards
disable_gpu_opencv = True
EOF
```
**2. Prepare Wildcards**:
```bash
# Check wildcard files exist
ls wildcards/*.txt wildcards/*.yaml
ls custom_wildcards/*.txt
```
### Running Tests
#### Unit Tests (Python)
**Standalone** (no server required):
```bash
python3 test_wildcard_lazy_loading.py
python3 test_progressive_loading.py
```
**Note**: Requires ComfyUI environment or will show import errors.
#### Integration Tests (Shell)
**Manual Server Start**:
```bash
# Terminal 1: Start server
cd /path/to/ComfyUI
bash run.sh --listen 127.0.0.1 --port 8188
# Terminal 2: Run tests
cd custom_nodes/comfyui-impact-pack/tests
bash test_versatile_prompts.sh
```
**Automated** (tests start/stop server):
```bash
# Each test manages its own server
bash test_progressive_ondemand.sh # Port 8195
bash test_lazy_load_api.sh # Ports 8190-8191
bash test_sequential_loading.sh # Port 8193
```
### Test Timing
| Test | Duration | Server | Ports |
|------|----------|--------|-------|
| `test_progressive_ondemand.sh` | ~2 min | Auto | 8195 |
| `test_lazy_load_api.sh` | ~3 min | Auto | 8190-8191 |
| `test_sequential_loading.sh` | ~5 min | Auto | 8193 |
| `test_versatile_prompts.sh` | ~2 min | Manual | 8188 |
| `test_wildcard_consistency.sh` | ~1 min | Manual | 8188 |
| Python unit tests | < 5 sec | No | N/A |
### Logs
**Server Logs**:
```bash
/tmp/progressive_test.log
/tmp/comfyui_full_cache.log
/tmp/comfyui_on_demand.log
/tmp/sequential_test.log
```
**Check Logs**:
```bash
# View recent wildcard logs
tail -50 /tmp/progressive_test.log | grep -i wildcard
# Find errors
grep -i "error\|fail" /tmp/*.log
# Check mode activation
grep -i "mode" /tmp/progressive_test.log
```
---
## Expected Results
### Success Criteria
#### Progressive Loading
-`/list/loaded` starts at 0 (or low count)
-`/list/loaded` increases after each unique wildcard
-`/list/loaded` unchanged on cache hits
- ✅ Transitive wildcards load multiple entries
- ✅ Final results identical to full cache mode
#### Lazy Loading
- ✅ Full cache results == On-demand results (all tests)
- ✅ Mode detection correct (based on size vs limit)
- ✅ LazyWildcardLoader loads only on access
- ✅ All API endpoints return consistent data
#### Sequential Loading
- ✅ Depth 1-3 expand correctly
- ✅ Complex scenarios work (weighted, multi-select, etc.)
- ✅ On-demand mode matches full cache
- ✅ No infinite loops (max 100 iterations)
#### Versatile Prompts
- ✅ All 30 test prompts process successfully
- ✅ Deterministic (same seed → same result)
- ✅ No syntax errors
- ✅ Proper probability distribution
### Sample Output
**Progressive Loading Success**:
```
========================================
Progressive Loading Verification
========================================
Step 1: Initial state
On-demand mode: True
Total available: 1000
Loaded wildcards: 0
Step 2: Access __samples/flower__
Result: rose
Loaded wildcards: 1
✓ PASS
Step 3: Access __dragon__
Result: ancient dragon
Loaded wildcards: 3
✓ PASS
🎉 ALL TESTS PASSED
Progressive on-demand loading verified!
```
**Lazy Loading Success**:
```
========================================
COMPARISON RESULTS
========================================
Test: Wildcard List (before)
✓ Results MATCH
Test: Simple Wildcard
✓ Results MATCH
Test: Depth 3 Transitive
✓ Results MATCH
🎉 ALL TESTS PASSED
On-demand produces IDENTICAL results!
```
---
## Troubleshooting
### Common Issues
#### 1. Server Fails to Start
**Symptoms**:
```
✗ Server failed to start
curl: (7) Failed to connect
```
**Solutions**:
```bash
# Check if port in use
lsof -i :8188
netstat -tlnp | grep 8188
# Kill existing processes
pkill -f "python.*main.py"
# Increase startup wait time
# In test script: sleep 15 → sleep 30
```
#### 2. Module Not Found (Python)
**Symptoms**:
```
ModuleNotFoundError: No module named 'modules'
```
**Solutions**:
```bash
# Option 1: Run from ComfyUI directory
cd /path/to/ComfyUI
python3 custom_nodes/comfyui-impact-pack/tests/test_progressive_loading.py
# Option 2: Add to PYTHONPATH
export PYTHONPATH=/path/to/ComfyUI/custom_nodes/comfyui-impact-pack:$PYTHONPATH
python3 test_progressive_loading.py
```
#### 3. On-Demand Mode Not Activating
**Symptoms**:
```
Using full cache mode.
```
**Check**:
```bash
# View total size
grep "Wildcard total size" /tmp/progressive_test.log
# Check cache limit
grep "cache_limit_mb" impact-pack.ini
```
**Solutions**:
```bash
# Force on-demand mode
cat > impact-pack.ini << EOF
[default]
wildcard_cache_limit_mb = 0.5
EOF
```
#### 4. Tests Timeout
**Symptoms**:
```
Waiting for server startup...
✗ Server failed to start
```
**Solutions**:
```bash
# Check system resources
free -h
df -h
# View server logs
tail -100 /tmp/progressive_test.log
# Manually test server
cd /path/to/ComfyUI
bash run.sh --port 8195
# Increase timeout in test
# sleep 15 → sleep 60
```
#### 5. Results Don't Match
**Symptoms**:
```
✗ Results DIFFER
```
**Debug**:
```bash
# Compare results
diff /tmp/result_full_cache_simple.json /tmp/result_on_demand_simple.json
# Check seeds are same
grep "seed" /tmp/result_*.json
# Verify same wildcard files used
ls -la wildcards/samples/flower.txt
```
**File Bug Report**:
- Wildcard text
- Seed value
- Full cache result
- On-demand result
- Server logs
#### 6. Slow Performance
**Symptoms**:
- Tests take much longer than expected
- Server startup > 2 minutes
**Check**:
```bash
# Wildcard size
du -sh wildcards/
# Disk I/O
iostat -x 1 5
# System resources
top
```
**Solutions**:
- Use SSD (not HDD)
- Reduce wildcard size
- Increase cache limit (use full cache mode)
- Close other applications
---
## Performance Benchmarks
### Expected Performance
**Small Dataset (< 50MB)**:
```
Mode: Full cache
Startup: < 10 seconds
Memory: ~50MB
First access: Instant
```
**Medium Dataset (50MB - 1GB)**:
```
Mode: On-demand
Startup: < 30 seconds
Memory: < 200MB initial
First access: 10-50ms per wildcard
```
**Large Dataset (10GB+)**:
```
Mode: On-demand
Startup: < 1 minute
Memory: < 100MB initial
First access: 10-50ms per wildcard
Memory growth: Progressive
```
### Optimization Tips
**For Faster Tests**:
1. Use smaller wildcard dataset
2. Run specific tests (not all)
3. Use manual server (keep running)
4. Skip sleep times (if server already running)
**For Large Datasets**:
1. Verify on-demand mode activates
2. Monitor `/list/loaded` to track memory
3. Use SSD for file storage
4. Organize wildcards into subdirectories
---
## Contributing
### Adding New Tests
**1. Create Test File**:
```bash
touch tests/test_new_feature.sh
chmod +x tests/test_new_feature.sh
```
**2. Test Template**:
```bash
#!/bin/bash
# Test: New Feature
# Purpose: Verify new feature works correctly
set -e
PORT=8XXX
IMPACT_DIR="/path/to/comfyui-impact-pack"
# Setup config
cat > impact-pack.ini << EOF
[default]
wildcard_cache_limit_mb = 50
EOF
# Start server
cd /path/to/ComfyUI
bash run.sh --port $PORT > /tmp/test_new.log 2>&1 &
sleep 15
# Test
RESULT=$(curl -s http://127.0.0.1:$PORT/impact/wildcards/list)
# Validate
if [ "$RESULT" = "expected" ]; then
echo "✅ PASS"
exit 0
else
echo "❌ FAIL"
exit 1
fi
```
**3. Update Documentation**:
- Add test description to this README
- Update test count
- Add to appropriate category
### Testing Guidelines
**Test Structure**:
1. Clear purpose statement
2. Setup (config, wildcards)
3. Execution (API calls, processing)
4. Validation (assertions, comparisons)
5. Cleanup (kill servers, restore config)
**Good Practices**:
- Use unique port numbers
- Clean up background processes
- Provide clear success/failure messages
- Log to `/tmp/` for debugging
- Use deterministic seeds
- Test both modes (full cache + on-demand)
---
## Reference
### Test Files Quick Reference
```bash
# Progressive loading
test_progressive_ondemand.sh # Integration test
test_progressive_loading.py # Unit test
# Lazy loading
test_lazy_load_api.sh # Integration test
test_wildcard_lazy_loading.py # Unit test
# Sequential/transitive
test_sequential_loading.sh # Integration test
find_transitive_wildcards.sh # Utility
# Features
test_versatile_prompts.sh # Comprehensive features
test_wildcard_features.sh # Core features
test_wildcard_consistency.sh # Consistency
# Validation
test_wildcard_final.py # Final validation
test_lazy_load_verification.py # Lazy load verification
```
### Documentation
- **System Overview**: `../docs/WILDCARD_SYSTEM_OVERVIEW.md`
- **Testing Guide**: `../docs/WILDCARD_TESTING_GUIDE.md`
### API Endpoints
```
GET /impact/wildcards/list # All available wildcards
GET /impact/wildcards/list/loaded # Actually loaded (progressive)
POST /impact/wildcards # Process wildcard text
GET /impact/wildcards/refresh # Reload all wildcards
```
---
**Last Updated**: 2024-11-17
**Total Tests**: 11 files, 100+ scenarios
**Coverage**: ~95% of wildcard features